为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
catspeake 2021-04-09 17:14:11
我有一些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做到这一点的最简单方法是什么?
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您没有明显的原因就拥有嵌套循环……您要为每个元素多次设置属性,而不是为每个元素设置一次属性。


一旦摆脱了嵌套循环,就很简单了。但是,如果您将查询具体化为列表,则更为简单。这是产生所需输出的完整示例:


using System;

using System.Linq;

using System.Xml.Linq;


class Test

{

    static void Main()

    {

        var xml = XDocument.Load("input.xml");

        var parts = xml.Descendants("PART").ToList();

        var models = xml.Descendants("PART").Elements("MODEL").ToList();


        for (int i = 0; i < parts.Count; i++)

        {

            parts[i].Attribute("no").Value = $"xs{i+1}";

        }


        for (int i = 0; i < models.Count; i++)

        {

            models[i].Attribute("ver").Value = $"v-{i+1}";

        }


        xml.Save("output.xml");

    }

}


查看完整回答
反对 回复 2021-04-17
  • 1 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信