1

我是 C# 的新手。我有一个返回 xml 响应的 java REST 服务,我正在尝试使用 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;
        }
    }
}
}

在我的主程序中,当我尝试时,我得到了一个 xmlNodes 数组

Array fields = (Array)doc.Fields;

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

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

4

2 回答 2

0

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

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

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

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

公共 ArrayList 字段 { 获取 { 返回 this._fields; } 设置 { this._fields = 值;} }

以前我的 PSDocument 类中有以下几行

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

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

于 2010-10-26T13:13:01.903 回答
0

据我所知,使用 ootb xml (de-)serializer 是不可能的,我认为您必须编写自己的 XmlSerializer。或者尝试使用 LINQ to XML。

于 2010-10-25T14:55:41.557 回答