猿问

如何使用LINQ-to-XML生成顺序属性值?

我有一些xml文件,格式如下所示,或者可能略有不同


<?xml version="1.0"?>

<!DOCTYPE PARTS SYSTEM "parts.dtd">

<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>

<PARTS>

    <TITLE>Computer Parts</TITLE>

    <ASST>

        <PART no="xs@@">

            <ITEM>Motherboard</ITEM>

            <MANUFACTURER>ASUS</MANUFACTURER>

            <MODEL ver="v-@@@@">P3B-F</MODEL>

            <COST>123.00</COST>

        </PART>

        <PART no="xs@@">

            <ITEM>Video Card</ITEM>

            <MANUFACTURER>ATI</MANUFACTURER>

            <MODEL ver="v-@@@@">All-in-Wonder Pro</MODEL>

            <COST>160.00</COST>

        </PART>

        <PART no="xs@@">

            <ITEM>Sound Card</ITEM>

            <MANUFACTURER>Creative Labs</MANUFACTURER>

            <MODEL ver="v-@@@@">Sound Blaster Live</MODEL>

            <COST>80.00</COST>

        </PART>

    </ASST>

</PARTS>

我试图产生节点的属性值<PART>即没有和<MODEL>即版本以顺序方式从值1开始,然后通过1从下一递增<PART>节点。因此,基本上所需的输出应如下所示


<?xml version="1.0"?>

<!DOCTYPE PARTS SYSTEM "parts.dtd">

<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>

<PARTS>

    <TITLE>Computer Parts</TITLE>

    <ASST>

        <PART no="xs1">

            <ITEM>Motherboard</ITEM>

            <MANUFACTURER>ASUS</MANUFACTURER>

            <MODEL ver="v-1">P3B-F</MODEL>

            <COST>123.00</COST>

        </PART>

        <PART no="xs2">

            <ITEM>Video Card</ITEM>

            <MANUFACTURER>ATI</MANUFACTURER>

            <MODEL ver="v-2">All-in-Wonder Pro</MODEL>

            <COST>160.00</COST>

        </PART>

        <PART no="xs3">

            <ITEM>Sound Card</ITEM>

            <MANUFACTURER>Creative Labs</MANUFACTURER>

            <MODEL ver="v-3">Sound Blaster Live</MODEL>

            <COST>80.00</COST>

        </PART>

    </ASST>

</PARTS>

那么,使用LINQ-to-XML做到这一点的最简单方法是什么?


catspeake
浏览 162回答 1
1回答

幕布斯6054654

您没有明显的原因就拥有嵌套循环……您要为每个元素多次设置属性,而不是为每个元素设置一次属性。一旦摆脱了嵌套循环,就很简单了。但是,如果您将查询具体化为列表,则更为简单。这是产生所需输出的完整示例:using System;using System.Linq;using System.Xml.Linq;class Test{&nbsp; &nbsp; static void Main()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var xml = XDocument.Load("input.xml");&nbsp; &nbsp; &nbsp; &nbsp; var parts = xml.Descendants("PART").ToList();&nbsp; &nbsp; &nbsp; &nbsp; var models = xml.Descendants("PART").Elements("MODEL").ToList();&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < parts.Count; i++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parts[i].Attribute("no").Value = $"xs{i+1}";&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < models.Count; i++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; models[i].Attribute("ver").Value = $"v-{i+1}";&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; xml.Save("output.xml");&nbsp; &nbsp; }}
随时随地看视频慕课网APP
我要回答