如何使用 LINQ-to-XML 生成顺序属性值?
How do I generate sequential attribute values using 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>
的属性值,即 no 和 <MODEL>
即 ver 以顺序方式从值 1 开始,然后从下一个 <PART>
节点开始递增 +1。
所以,基本上所需的输出应该是这样的
<?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 执行此操作的最简单方法是什么?
我正在尝试
string filecontent=File.ReadAllText(@"C:\Users\Desktop-apr.xml");
XDocument xml=XDocument.Parse(filecontent);
var parts=xml.Descendants("PART");
var models=xml.Descendants("PART").Elements("MODEL");
foreach (var part in parts)
{
for (int i = 0; i < parts.Count(); i++)
{
part.Attribute("no").Value="xs"+i.ToString();
}
}
foreach (var model in models)
{
for (int i = 0; i < parts.Count(); i++)
{
model.Attribute("ver").Value="v-"+i.ToString();
}
}
xml.Save(@"C:\Users\Desktop-apr.xml");
Console.ReadLine();
但是它没有按照我的预期工作..
我的代码产生的输出
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE PARTS SYSTEM "parts.dtd"[]>
<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>
<PARTS>
<TITLE>Computer Parts</TITLE>
<ASST>
<PART no="xs2">
<ITEM>Motherboard</ITEM>
<MANUFACTURER>ASUS</MANUFACTURER>
<MODEL ver="v-2">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="xs2">
<ITEM>Sound Card</ITEM>
<MANUFACTURER>Creative Labs</MANUFACTURER>
<MODEL ver="v-2">Sound Blaster Live</MODEL>
<COST>80.00</COST>
</PART>
</ASST>
</PARTS>
帮助
您无缘无故地嵌套了循环...您为 每个 元素设置了多次属性,而不是为每个元素设置一次属性。
一旦摆脱了嵌套循环,就很简单了。不过,如果您将查询具体化为列表,那就更简单了。这是一个完整的示例,可以生成您想要的输出:
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");
}
}
我有一些 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>
的属性值,即 no 和 <MODEL>
即 ver 以顺序方式从值 1 开始,然后从下一个 <PART>
节点开始递增 +1。
所以,基本上所需的输出应该是这样的
<?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 执行此操作的最简单方法是什么?
我正在尝试
string filecontent=File.ReadAllText(@"C:\Users\Desktop-apr.xml");
XDocument xml=XDocument.Parse(filecontent);
var parts=xml.Descendants("PART");
var models=xml.Descendants("PART").Elements("MODEL");
foreach (var part in parts)
{
for (int i = 0; i < parts.Count(); i++)
{
part.Attribute("no").Value="xs"+i.ToString();
}
}
foreach (var model in models)
{
for (int i = 0; i < parts.Count(); i++)
{
model.Attribute("ver").Value="v-"+i.ToString();
}
}
xml.Save(@"C:\Users\Desktop-apr.xml");
Console.ReadLine();
但是它没有按照我的预期工作.. 我的代码产生的输出
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE PARTS SYSTEM "parts.dtd"[]>
<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>
<PARTS>
<TITLE>Computer Parts</TITLE>
<ASST>
<PART no="xs2">
<ITEM>Motherboard</ITEM>
<MANUFACTURER>ASUS</MANUFACTURER>
<MODEL ver="v-2">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="xs2">
<ITEM>Sound Card</ITEM>
<MANUFACTURER>Creative Labs</MANUFACTURER>
<MODEL ver="v-2">Sound Blaster Live</MODEL>
<COST>80.00</COST>
</PART>
</ASST>
</PARTS>
帮助
您无缘无故地嵌套了循环...您为 每个 元素设置了多次属性,而不是为每个元素设置一次属性。
一旦摆脱了嵌套循环,就很简单了。不过,如果您将查询具体化为列表,那就更简单了。这是一个完整的示例,可以生成您想要的输出:
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");
}
}