XMLSerializer 无法反序列化 xml 文档

发布于 2024-09-29 02:45:13 字数 6488 浏览 8 评论 0原文

我是 C# 的新手。我有一个 java REST 服务,它返回 xml 响应,我正在尝试使用 C# XmlSerializer 反序列化 xml 文档。下面粘贴了示例 xml 文档响应。

<?xml version="1.0" encoding="UTF-8"
 standalone="yes" ?>  <ns2:Document
 xmlns:ns2="http://hxps.honeywell.com/model/impl"
 xmlns:ns3="http://hxps.honeywell.com/datatypes/impl"
 type="PS">
 <docId>SamplePSDocument1</docId> 
 <fields
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:ns5="http://jaxb.dev.java.net/array"
 xsi:type="ns5:anyTypeArray">   <item
 xsi:type="ns3:scalarFieldImpl"
 key="Name">
      <value xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xsi:type="xs:string">HXPS A4</value>
 </item>   <item
 xsi:type="ns3:scalarFieldImpl"
 key="Creation Date">
       <value xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xsi:type="xs:string">20 April
 2007</value>    </item> </fields>
 <id>fb92f871-1f3d-4fa4-ba24-5ae3af0a493f</id>
 <revision>1-c75f688e212fb5341ebdbd22a3867c14</revision>

 - <version>   <majorVersionNumber>1</majorVersionNumber>
 <minorVerisonNumber>5</minorVerisonNumber>
 </version> </ns2:document>

当我将此 xml 文档反序列化为 Document 对象时,它工作正常。我的文档类粘贴在下面

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://hxps.honeywell.com/model/impl", TypeName = "PSDocument")]
[System.Xml.Serialization.SoapTypeAttribute(Namespace = "http://hxps.honeywell.com/model/impl", TypeName = "PSDocument")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://hxps.honeywell.com/model/impl", ElementName = "Document")]

public partial class PSDocument
{

    private Com.Honeywell.Hxps.Sdk.Model.DocumentType _type;
    private string _description;
    private string _displayName;
    private string _docId;
    private Com.Honeywell.Hxps.Sdk.Model.Impl.VersionImpl _version;
    private object _fields;
    private string _revision;
    private string _id;
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlAttributeAttribute(AttributeName = "type")]
    [System.Xml.Serialization.SoapAttributeAttribute(AttributeName = "type")]
    public Com.Honeywell.Hxps.Sdk.Model.DocumentType Type
    {
        get
        {
            return this._type;
        }
        set
        {
            this._type = value;
        }
    }

    /// <summary>
    ///  Property for the XML serializer indicating whether the "Type" property should be included in the output.
    /// </summary>
    [System.Xml.Serialization.XmlIgnoreAttribute]
    [System.Xml.Serialization.SoapIgnoreAttribute]
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public bool TypeSpecified
    {
        get
        {
            return this._type != Com.Honeywell.Hxps.Sdk.Model.DocumentType.NULL;
        }
        set
        {
            if (!value)
            {
                this._type = Com.Honeywell.Hxps.Sdk.Model.DocumentType.NULL;
            }
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "description", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "description")]
    public string Description
    {
        get
        {
            return this._description;
        }
        set
        {
            this._description = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "displayName", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "displayName")]
    public string DisplayName
    {
        get
        {
            return this._displayName;
        }
        set
        {
            this._displayName = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "docId", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "docId")]
    public string DocId
    {
        get
        {
            return this._docId;
        }
        set
        {
            this._docId = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "version", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "version")]
    public Com.Honeywell.Hxps.Sdk.Model.Impl.VersionImpl Version
    {
        get
        {
            return this._version;
        }
        set
        {
            this._version = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "fields", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "fields")]
    public object Fields
    {
        get
        {
            return this._fields;
        }
        set
        {
            this._fields = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "revision", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "revision")]
    public string Revision
    {
        get
        {
            return this._revision;
        }
        set
        {
            this._revision = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "id", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "id")]
    public string Id
    {
        get
        {
            return this._id;
        }
        set
        {
            this._id = value;
        }
    }
}
}

在我的主程序中,当我尝试

Array fields = (Array)doc.Fields;

在服务器端 java REST 服务实现中时,我得到一个 xmlNodes 数组,字段实际上是一个数组列表,其中包含接口的三个实现的实例。 (列表可能包含 ScalarFieldImpl 或 ArrayFieldImpl,它们是自定义业务对象)。

我想使用 XmlSerializer 将此 xml 字段反序列化为 ScalarFieldImpl 或 ArrayFieldImpl。我想知道是否可以?如果是这样,我该怎么做?

I am a newbie to C#. I have a java REST service which returns a xml response and I am trying to deserialize the xml document using C# XmlSerializer. A sample xml document response is pasted below.

<?xml version="1.0" encoding="UTF-8"
 standalone="yes" ?>  <ns2:Document
 xmlns:ns2="http://hxps.honeywell.com/model/impl"
 xmlns:ns3="http://hxps.honeywell.com/datatypes/impl"
 type="PS">
 <docId>SamplePSDocument1</docId> 
 <fields
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:ns5="http://jaxb.dev.java.net/array"
 xsi:type="ns5:anyTypeArray">   <item
 xsi:type="ns3:scalarFieldImpl"
 key="Name">
      <value xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xsi:type="xs:string">HXPS A4</value>
 </item>   <item
 xsi:type="ns3:scalarFieldImpl"
 key="Creation Date">
       <value xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xsi:type="xs:string">20 April
 2007</value>    </item> </fields>
 <id>fb92f871-1f3d-4fa4-ba24-5ae3af0a493f</id>
 <revision>1-c75f688e212fb5341ebdbd22a3867c14</revision>

 - <version>   <majorVersionNumber>1</majorVersionNumber>
 <minorVerisonNumber>5</minorVerisonNumber>
 </version> </ns2:document>

It works fine when I deserialize this xml document into Document object. My document class is pasted below

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://hxps.honeywell.com/model/impl", TypeName = "PSDocument")]
[System.Xml.Serialization.SoapTypeAttribute(Namespace = "http://hxps.honeywell.com/model/impl", TypeName = "PSDocument")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://hxps.honeywell.com/model/impl", ElementName = "Document")]

public partial class PSDocument
{

    private Com.Honeywell.Hxps.Sdk.Model.DocumentType _type;
    private string _description;
    private string _displayName;
    private string _docId;
    private Com.Honeywell.Hxps.Sdk.Model.Impl.VersionImpl _version;
    private object _fields;
    private string _revision;
    private string _id;
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlAttributeAttribute(AttributeName = "type")]
    [System.Xml.Serialization.SoapAttributeAttribute(AttributeName = "type")]
    public Com.Honeywell.Hxps.Sdk.Model.DocumentType Type
    {
        get
        {
            return this._type;
        }
        set
        {
            this._type = value;
        }
    }

    /// <summary>
    ///  Property for the XML serializer indicating whether the "Type" property should be included in the output.
    /// </summary>
    [System.Xml.Serialization.XmlIgnoreAttribute]
    [System.Xml.Serialization.SoapIgnoreAttribute]
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public bool TypeSpecified
    {
        get
        {
            return this._type != Com.Honeywell.Hxps.Sdk.Model.DocumentType.NULL;
        }
        set
        {
            if (!value)
            {
                this._type = Com.Honeywell.Hxps.Sdk.Model.DocumentType.NULL;
            }
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "description", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "description")]
    public string Description
    {
        get
        {
            return this._description;
        }
        set
        {
            this._description = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "displayName", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "displayName")]
    public string DisplayName
    {
        get
        {
            return this._displayName;
        }
        set
        {
            this._displayName = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "docId", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "docId")]
    public string DocId
    {
        get
        {
            return this._docId;
        }
        set
        {
            this._docId = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "version", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "version")]
    public Com.Honeywell.Hxps.Sdk.Model.Impl.VersionImpl Version
    {
        get
        {
            return this._version;
        }
        set
        {
            this._version = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "fields", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "fields")]
    public object Fields
    {
        get
        {
            return this._fields;
        }
        set
        {
            this._fields = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "revision", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "revision")]
    public string Revision
    {
        get
        {
            return this._revision;
        }
        set
        {
            this._revision = value;
        }
    }
    /// <summary>
    ///  (no documentation provided)
    /// </summary>
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "id", Namespace = "")]
    [System.Xml.Serialization.SoapElementAttribute(ElementName = "id")]
    public string Id
    {
        get
        {
            return this._id;
        }
        set
        {
            this._id = value;
        }
    }
}
}

In my main program, I get an array of xmlNodes when I try

Array fields = (Array)doc.Fields;

In the server side java REST service implementation, fields is actually a arraylist which will contain instances of three implementations of an interface. (List may contain ScalarFieldImpl or ArrayFieldImpl which are custom business objects).

I want to deserialize this xml fields into ScalarFieldImpl or ArrayFieldImpl using XmlSerializer. I want to know whether it is possible? If so, how do I do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

静待花开 2024-10-06 02:45:13

据我所知,ootb xml(反)序列化程序不可能做到这一点,我认为您必须 编写您自己的 XmlSerializer。或者尝试使用 LINQ to XML。

As far as I know this isn't possible with the ootb xml (de-)serializer, I think you'll have to write your own XmlSerializer. Or try to use LINQ to XML.

做个少女永远怀春 2024-10-06 02:45:13

我得到了这个工作。我在 PSDocument 类中做了一些更改。

私有对象_fields; ->私有ArrayList_fields;

我还更改了 get/set 方法并添加了新的元数据

[System.Xml.Serialization.XmlArray(ElementName = "fields", Namespace = "")]
[System.Xml.Serialization.XmlArrayItem(ElementName="item")]

公共 ArrayList 字段
{
得到
{
返回这个._fields;
}

{
this._fields = 值;
}
以前,

我的 PSDocument 类中有以下几行

[System.Xml.Serialization.XmlElementAttribute(ElementName = "fields", Namespace = "")]
[System.Xml.Serialization.SoapElementAttribute(ElementName = "字段")]
公共对象字段
{
得到
{
返回这个._fields;
}

{
this._fields = 值;
}
因此

,在反序列化 PSDocument 中的字段时,我得到一个以项目作为元素的数组列表。
希望这对某人有帮助。

I got this working. I did few changes in my PSDocument class.

private object _fields; -> private ArrayList _fields;

Also I changed get/set method and added new metadata

[System.Xml.Serialization.XmlArray(ElementName = "fields", Namespace = "")]
[System.Xml.Serialization.XmlArrayItem(ElementName="item")]

public ArrayList Fields
{
get
{
return this._fields;
}
set
{
this._fields = value;
}
}

Previously I had the following lines in my PSDocument class

[System.Xml.Serialization.XmlElementAttribute(ElementName = "fields", Namespace = "")]
[System.Xml.Serialization.SoapElementAttribute(ElementName = "fields")]
public object Fields
{
get
{
return this._fields;
}
set
{
this._fields = value;
}
}

So while deserializing fields in PSDocument, I get an arraylist with items as elements.
Hope this helps someone.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文