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; }
}
我需要反序列化一个 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; }
}