c# - 使用属性反序列化具有嵌套元素的XML

时间:2016-12-22 15:21:23

标签: c# xml xml-deserialization

我需要反序列化XML文件。到目前为止,我已成功使用[XmlElement]属性。它很棒。我绊倒的地方是嵌套元素。例如<root><level1><set1><data1>x</data1><data2>y</data2></set1>.....</root>我只希望捕获第1组中的data2。我已经尝试了[XmlArray]和[XmlArrayItem],但没有多少运气。我可能是错的,但我不认为List是合适的,因为我只想要class属性的一个值。有一个更好的例子,对我的问题更具体。在其中我将关注捕获嵌套在<NAME>中的<H_DATA_1>内的<HEADER>元素我已经成功地从第一个<METADATA>内部捕获了我需要的内容。 <PRODUCTION_SET>以及从<METADATA>内的第二个<PRODUCING_ENTITY>拉出我需要的东西,但是我的方法似乎无法处理标头标记内的额外嵌套。

XML

<PRODUCTION_SET>
    <METADATA>
        <M_DATA_1>X</M_DATA_1>
        <M_DATA_2>Y</M_DATA_2>
        <M_DATA_3>Z</M_DATA_3>
    </METADATA>
    <PRODUCING_ENTITY>
        <METADATA>
            <PM_Data_1>X<PM_Data_1>
            <PM_Data_2>Y<PM_Data_2>
        </Metadata>
        <HEADER>
            <H_DATA_1>
                <NAME>I NEED THIS NAME</NAME>
            </H_DATA_1>
            <H_DATA_2>
                <NAME>I ALSO NEED THIS NAME</NAME>
                <CODE>DO NOT WANT THIS CODE</CODE>
            </H_DATA_2>
            <H_DATA_3>
                <NAME>I DO NOT NEED THIS NAME</NAME>
            </H_DATA_3>
        </HEADER>
    </PRODUCING_ENTITY>
    <PRODUCING_ENTITY>
    .
    .
    .
    </PRODUCING_ENTITY>
.
.
.
.
</PRODUCING_SET>

[Serializable()]
[XmlRoot("PRODUCTION_SET")]
public class ProductionSet
{
    [XmlElement("METADATA")]
    public List<Metadata> Metadata { get; set; }

    [XmlElement("PRODUCING_ENTITY")]
    public List<Producing_Entity> ProducingEntity { get; set; }

}

public class Metadata
{
    [XmlElement("M_DATA_1")]
    public string mData1 { get; set; }
    [XmlElement("M_DATA_2")]
    public string mdata2 { get; set; }
}

public class Producing_Entity
{
    [XmlElement("METADATA")]
    public List<ProdMeta> ProdMeta { get; set; }

    [XmlElement("HEADER")]
    public List<Header> Header { get; set; }


}

public class ProdMeta
{
    [XmlElement("PM_DATA_1")]
    public string pmData1{ get; set; }

}


public class Header
{
    [XmlElement("H_DATA1")]
    [XmlElement("NAME")]
    public string H_DATA1_Name { get; set; }


    [XmlElement("H_DATA2")]
    [XmlElement("NAME")]
    public string H_DATA2_Name { get; set; }


}

1 个答案:

答案 0 :(得分:1)

您还需要更多一步:

public class Header
{
    [XmlElement("H_DATA1")]
    public H_DATA1 HData1 { get; set; }
    ....
}

public class H_DATA1 
{
    [XmlElement("NAME")]
    public String Name { get; set; }
}
相关问题