c# - 使用属性反序列化 XML w/ 嵌套元素

c# - Deserialize XML w/ Nested Elements Using Attributes

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

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>

CLASS

[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; }


}

您还需要一步:

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

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