如何读取Xml,然后在C#中以不同格式编写Xml

时间:2019-06-12 03:11:00

标签: c# xml

即使它们不一致,我也需要获取每个元素的属性值。像我的示例一样,一个人可以有多个生日,因此我需要提供具有相同生日数的输出。您可以看到原始数据和示例输出。

我已经尝试过将XMLnodelists与foreach一起使用,但它的作用是即使一个人不生日,它也包含一个人的所有生日。

这是原始数据xml的示例

<element>
<details firstName="testfirst" middleName="testmiddle" lastName="testlast" wholeName="testwholename" function="testjob">
</details>
<bdate bdate="1900-02-01" place="testplace" country="testcountry">
</bdate>
</element>
<element>
<details firstName="testfirst1" middleName="testmiddle1" lastName="testlast1" wholeName="testwholename1" function="testjob1">
</details>
<bdate bdate="1900-01-01" place="testplace1" country="testcountry1">
</bdate>
<bdate bdate="1900-01-02" place="testplace2" country="testcountry2">
</bdate>
<bdate bdate="1900-01-03" place="testplace2" country="testcountry2">
</bdate>
</element>
<element>
<details firstName="testfirst2" middleName="testmiddle2" lastName="testlast2" wholeName="testwholename2" function="testjob2">
</details>
<details firstName="testfirst3" middleName="testmiddle3" lastName="testlast3" wholeName="testwholename3" function="testjob3">
</details>
<details firstName="testfirst4" middleName="testmiddle4" lastName="testlast4" wholeName="testwholename4" function="testjob4">
</details>
<bdate bdate="1900-01-04" place="testplace3" country="testcountry3">
</bdate>
<bdate bdate="1900-01-05" place="testplace4" country="testcountry4">
</bdate>
</element>

这应该是输出

<ELEMENT>
<FULLNAME>testwholename</FULLNAME>
<FIRSTNAME>testfirst</FIRSTNAME>
<MIDDLENAME>testmiddle</MIDDLENAME>
<LASTNAME>testlast</LASTNAME>
<POSITION>testjob</POSITION>
<BIRTH>
<DATE>1900-02-01</DATE>
<PLACE>testplace</PLACE>
<COUNTRY>testcountry</COUNTRY>
</BIRTH>
</ELEMENT>
<ELEMENT>
<FULLNAME>testwholename1</FULLNAME>
<FIRSTNAME>testfirst1</FIRSTNAME>
<MIDDLENAME>testmiddle1</MIDDLENAME>
<LASTNAME>testlast1</LASTNAME>
<POSITION>testjob1</POSITION>
<BIRTH>
<DATE>1900-01-01</DATE>
<PLACE>testplace1</PLACE>
<COUNTRY>testcountry1</COUNTRY>
</BIRTH>
<BIRTH>
<DATE>1900-01-02</DATE>
<PLACE>testplace2</PLACE>
<COUNTRY>testcountry2</COUNTRY>
</BIRTH>
<BIRTH>
<DATE>1900-01-03</DATE>
<PLACE>testplace3</PLACE>
<COUNTRY>testcountry3</COUNTRY>
</BIRTH>
</ELEMENT>
<ELEMENT>
<FULLNAME>testwholename2</FULLNAME>
<FIRSTNAME>testfirst2</FIRSTNAME>
<MIDDLENAME>testmiddle2</MIDDLENAME>
<LASTNAME>testlast2</LASTNAME>
<POSITION>testjob2</POSITION>
<BIRTH>
<DATE>1900-01-04</DATE>
<PLACE>testplace3</PLACE>
<COUNTRY>testcountry3</COUNTRY>
</BIRTH>
<BIRTH>
<DATE>1900-01-05</DATE>
<PLACE>testplace4</PLACE>
<COUNTRY>testcountry4</COUNTRY>
</BIRTH>
</ELEMENT>
<ELEMENT>
<FULLNAME>testwholename3</FULLNAME>
<FIRSTNAME>testfirst3</FIRSTNAME>
<MIDDLENAME>testmiddle3</MIDDLENAME>
<LASTNAME>testlast3</LASTNAME>
<POSITION>testjob3</POSITION>
<BIRTH>
<DATE>1900-01-04</DATE>
<PLACE>testplace3</PLACE>
<COUNTRY>testcountry3</COUNTRY>
</BIRTH>
<BIRTH>
<DATE>1900-01-05</DATE>
<PLACE>testplace4</PLACE>
<COUNTRY>testcountry4</COUNTRY>
</BIRTH>
</ELEMENT>
<ELEMENT>
<FULLNAME>testwholename4</FULLNAME>
<FIRSTNAME>testfirst4</FIRSTNAME>
<MIDDLENAME>testmiddle4</MIDDLENAME>
<LASTNAME>testlast4</LASTNAME>
<POSITION>testjob4</POSITION>
<BIRTH>
<DATE>1900-01-04</DATE>
<PLACE>testplace3</PLACE>
<COUNTRY>testcountry3</COUNTRY>
</BIRTH>
<BIRTH>
<DATE>1900-01-05</DATE>
<PLACE>testplace4</PLACE>
<COUNTRY>testcountry4</COUNTRY>
</BIRTH>
</ELEMENT>

1 个答案:

答案 0 :(得分:0)

听起来您需要使用一些XPath来解决这个问题。

// Select all <details> that exist under a <element>
var inputPeople = document.SelectNodes("//element/details");
foreach (XmlElement inputPerson in inputPeople)
{
    ...

    // Select all <bdate> that exist in the same <element> as the <details>
    var inputBirthdates = inputPerson.SelectNodes("../bdate");
    foreach (XmlElement inputBirthdate in inputBirthdates)
    {
    }

    ...
}