标签: xml-deserialization

VB/VBA中的XML反序列化

我在MS Access数据库中有一组VBA类.我有一个xml字符串,其中包含我想要创建新类的数据.

除了单独设置每个属性之外,还有一种简单的方法可以将XML反序列化为我的对象吗?

我已经看到使用TypeLib库的代码

Public Sub ISerializable_Deserialize(xml As IXMLDOMNode)

  Dim tTLI As TLIApplication
  Dim tInvoke As InvokeKinds
  Dim tName As String
  Dim tMem As MemberInfo

  tInvoke = VbLet

  For Each tMem In TLI.ClassInfoFromObject(Me).Members

     tName = LCase(tMem.Name)

     CallByName Me, tMem.Name, VbLet, xml.Attributes.getNamedItem(tName).Text

  Next tMem
End Sub
Run Code Online (Sandbox Code Playgroud)

但这似乎不适用于标准类模块.我收到429错误:

ActiveX Component Cannot Be Created
Run Code Online (Sandbox Code Playgroud)

其他人可以帮帮我吗?如果我可以提供帮助,我宁愿不必手动设置每个属性,这些类中的一些是巨大的!

xml vb6 serialization vba xml-deserialization

5
推荐指数
1
解决办法
3581
查看次数

C#中的Xml序列化

我正在尝试关注有关XML序列化的微软教程,但是我遇到了一些问题!

这是XML文件,用作输入:

<?xml version="1.0" encoding="utf-8"?>
<Books xmlns:books="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
  <money:Book>
    <books:TITLE>A Book Title</books:TITLE>
    <money:PRICE books:currency="US Dollar">
      <money:price>9.95</money:price>
    </money:PRICE>
  </money:Book>
</Books>
Run Code Online (Sandbox Code Playgroud)

这是绑定XML的类:

public class OrderedItem
{
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public string ItemName;
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public string Description;
        [XmlElement(Namespace = "http://www.cohowinery.com")]
        public decimal UnitPrice;
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public int Quantity;
        [XmlElement(Namespace = "http://www.cohowinery.com")]
        public decimal LineTotal;
        // A custom method used to calculate price per item.
        public void Calculate()
        {
            LineTotal = UnitPrice * Quantity;
        }
    }
Run Code Online (Sandbox Code Playgroud)

该函数将XML读入'OrderedItem'类:

Console.WriteLine("Reading with …
Run Code Online (Sandbox Code Playgroud)

.net xml serialization xml-deserialization

5
推荐指数
1
解决办法
524
查看次数

5
推荐指数
2
解决办法
1442
查看次数

无法使用WCF Web服务的XMLSerializer结果反序列化

这是从紧凑框架尝试获取http服务的代码.

    List<Table> tables;
    using (Stream r = response.GetResponseStream())
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Table),"http://schemas.datacontract.org/2004/07/");
        tables=(List<Table>) serializer.Deserialize(r);
    }

   response.Close();
Run Code Online (Sandbox Code Playgroud)

它失败了{"XML文档中存在错误(1,2)."}

{"<ArrayOfTable xmlns='http://schemas.datacontract.org/2004/07/WpfApplication1.Data.Model'> was not expected."}
Run Code Online (Sandbox Code Playgroud)

表命名空间是一样的...我不知道那里有什么错...

UPDATE

问题是我有typeof(表)而不是typeof(List<Table>)部分工作..没有错误但创建的表值为null!

wcf xml-deserialization

5
推荐指数
1
解决办法
4300
查看次数

XStream - unmarshalling - XML中指定的类型不可见

我刚才有一些XStream存储的XML文件,它们包含对RandomAccessSubList的引用,这个类在包级别之外是不可见的,并且没有默认构造函数,所以XStream抛出了这个错误:

com.thoughtworks.xstream.converters.ConversionException: Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor

---- Debugging information ----
message             : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor*
Run Code Online (Sandbox Code Playgroud)

这是XML:

<customTimes class="java.util.RandomAccessSubList">
  <l class="list">
    <long>1302174300146</long>
    <long>1302174305231</long>
    <long>1302174310312</long>
Run Code Online (Sandbox Code Playgroud)

等等

我不能只为RandomAccessSubList编写一个转换器,因为它在util包之外是不可见的.如何告诉XStream忽略该属性的类,或者如何为我无法引用的类指定转换器?

提前致谢!

java xstream xml-deserialization

5
推荐指数
1
解决办法
4377
查看次数

尽管元素值包含混合内容,但将元素值反序列化为字符串

假设这样的XML:

<my:Root xmlns:my="http://foo/bar">
    <my:FieldBasic>content</my:FieldBasic>
    <my:FieldComplex>
        <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
            <div><h1>content</h1></div>
        </html>
    </my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)

还有一个类:

[Serializable]
[XmlType(AnonymousType = true, Namespace = "http://foo/bar")]
[XmlRoot(ElementName = "Root", Namespace = "http://foo/bar", IsNullable = false)]
public class MyRoot
{
    public string FieldBasic { get; set; }
    public string FieldComplex { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何反序列化为<my:FieldComplex>内部的字符串FieldComplex?它在内部找到HTML时失败.我想让它给我一个包含这个内容的字符串:

<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
    <div><h1>content</h1></div>
</html>
Run Code Online (Sandbox Code Playgroud)

如果我宣布FieldComplexpublic object FieldComplex(即xsd:anyType)它有点工作,我得到一个XMLNode[]里面,我可以使用.

但我需要FieldComplex序列化的类型字符串,因为序列化XML不包含HTML,它将像:

<my:Root xmlns:my="http://foo/bar">
    <my:FieldBasic>content</my:FieldBasic>
    <my:FieldComplex>content</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)

声明FieldComplex为对象将在 …

c# serialization xml-serialization xml-deserialization deserialization

5
推荐指数
1
解决办法
2155
查看次数

JAXB和类的不同版本

我想知道在JAXB中是否支持不同版本的类.我对它的看法:xml是类的一种持久化对象(序列化值),但是由于开发(例如扩展功能),可以改变类对象.有没有办法知道只使用JAXB API在持久性(read:xml)中存储哪个版本的类?

对我来说,存储类版本似乎很方便 - 就像它在标准的java序列化机制(我的意思是serialVersionUID)中所做的那样,并提供在类上映射xml的功能,即使在不同版本的情况下(例如,在XmlAdapter中添加关于存储在xml中的类的版本的信息) ).默认情况下,如果xml和运行时中的类版本不同 - 抛出InvalidClassException.

示例:我们的课程测试如下:

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {

    private Long time;

    private Test () {}; 
}
Run Code Online (Sandbox Code Playgroud)

假设时间是以毫秒为单位的UNIX时间.

此代码在生产时发布,此类作为xml保存在数据库中.下一个版本显示使用Long作为时间表示并且它已更改为Date不是一个好选择:

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {

    private Date time;

    private Test () {}; 
}
Run Code Online (Sandbox Code Playgroud)

现在有两种方法 - 迁移持久化数据或编写将处理长时间并将其应用于日期时间的xml适配器.

如果我们选择第二种方式,那么如果JAXB API提供存储在xml中的类版本(假设在class = 0版本中没有指定类版本)并且我们显式添加新版本的类(通过注释或静态)领域):

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlClassVersion(value = 1)
public class Test {

    private Date time;

    private Test () {}; 
}
Run Code Online (Sandbox Code Playgroud)

要么

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {

    private static …
Run Code Online (Sandbox Code Playgroud)

java jaxb xml-serialization xml-deserialization

5
推荐指数
1
解决办法
1403
查看次数

具有未知XML的SAP简单转换

我有未知结构的XML,我想在它上面应用ST(简单转换),以"某种方式"将XML中的内容转换为ABAP结构.

现在我有以下测试报告:

report  ztbu_st_with_copy.

data: lf_xml type string.
concatenate '<tab><obj>'
              '<id>A1</id>'
              '<first>Erste</first>'
              '<second>Zweite</second>'
            '</obj><obj>'
              '<id>B2</id>'
              '<item>'
                '<here>Tady</here>'
                '<there>Tam</there>'
              '</item>'
            '</obj>'
            '</tab>'
       into lf_xml.

types: begin of ys_obj,
         id type string,
         rest type string,
       end of ys_obj,
       yt_obj type standard table of ys_obj.

data: lt_obj type yt_obj.

call transformation ztbu_st_copy_test
  source xml lf_xml
  result root = lt_obj.

uline.

data: ls_obj like line of lt_obj.
loop at lt_obj into ls_obj.
  write: / sy-tabix, ls_obj-id.
endloop.

uline.
Run Code Online (Sandbox Code Playgroud)

我跟随ST转换ZTBU_ST_COPY_TEST(上面调用的那个):

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">

<tt:root …
Run Code Online (Sandbox Code Playgroud)

xml sap abap xml-deserialization

5
推荐指数
1
解决办法
4313
查看次数

从webapi中删除xmlns:i和xmlns

我被要求从http端点提供以下XML文档,如下所示: -

<?xml version="1.0" encoding="utf-8"?> 
  <XMLFile xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SalesOrders>
 ...
</SalesOrders>
Run Code Online (Sandbox Code Playgroud)

但Web API会吐出来

<?xml version="1.0" encoding="utf-8"?>
<XMLFile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/White.Label.Ordering.Infrastructure.Data.Queries.Export">
    <SalesOrders>
        ...
    </SalesOrders>
Run Code Online (Sandbox Code Playgroud)

我有谷歌并尝试各种修复,但无济于事,我的模型看起来像

[DataContract]
public class XMLFile
{
    [DataMember]
    public List<SalesOrder> SalesOrders { get; set; }
}

[DataContract]
public class SalesOrder
{
    [DataMember(Order = 1)]
    public string OrderNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的设置就像这样

    public static void Register(HttpConfiguration config)
    {
        config.Formatters.XmlFormatter.WriterSettings.OmitXmlDeclaration = false;
        ...

    }
Run Code Online (Sandbox Code Playgroud)

如何做我删除xmlns:i,并xmlns与更换xmlns:xsdxmlns:xsi

我知道这是一个不好的问题,因为它应该没关系,但我的消费客户正在bar.

c# xml xml-deserialization asp.net-web-api

5
推荐指数
1
解决办法
2706
查看次数

将XML反序列化为C#XmlRoot中的对象不起作用

我使用asp.net(C#)的网站,我想DeserializeXML字符串中使用XmlSerializer类。

我的模型(.cs文件)

[XmlRoot("MedicalClearanceFormRoot")]
  public class MedicalClearanceViewModel
  {


    [XmlAttribute("PassengerName")]
    public string PassengerName { get; set; }

    [XmlAttribute("Gender")]
    public string Gender { get; set; }

    [XmlAttribute("Age")]
    public string Age { get; set; }

    [XmlAttribute("PhoneNo")]
    public string PhoneNo { get; set; }

    [XmlAttribute("Email")]
    public string Email { get; set; }

    [XmlAttribute("BookingRefNo")]
    public string BookingRefNo { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

XML字串

<MedicalClearanceFormRoot>
  <MedicalClearanceForm PassengerName="AAAAAAAAAAAAA" Age="11" PhoneNo="TTTTTTTTTTT" Email="ZZZZZZZZZZZZZZZZZZZ" BookingRefNo="11111111111111111111" />  
</MedicalClearanceFormRoot>
Run Code Online (Sandbox Code Playgroud)

将XML反序列化为对象的代码

string myXMLStringFromDB = GetXMLStringFromDb(); // this method …
Run Code Online (Sandbox Code Playgroud)

c# xml asp.net asp.net-mvc xml-deserialization

5
推荐指数
1
解决办法
1626
查看次数