使用 C# 读取 XML 并将信息分组在一起
Reading XML with C# and grouping Information together
<?xml version="1.0" encoding="ISO-8859-1"?>
<detail id="TestXML">
<styles>
<Maininfo id="Set1">
<info1>Test1</info1>
<info2>Test2</info2>
<info2>Test3</info2>
<secondinfo>
<secondinfo-base id="1234567">
<description>BlahBlah</description>
<quantity>1</quantity>
</secondinfo-base>
</secondinfo>
<colors>
<color id="54321">
<color-id>54321</color-id>
<name>Test Color</name>
</color>
</colors>
</Maininfo>
</styles>
<styles>
<Maininfo id="Set2">
<info1>Test4</info1>
<info2>Test5</info2>
<info2>Test6</info2>
<secondinfo>
<secondinfo-base id="7654321">
<description>BlahBlahandBlah</description>
<quantity>2</quantity>
</secondinfo-base>
</secondinfo>
<colors>
<color id="12345">
<color-id>12345</color-id>
<name>Yellow</name>
</color>
<color id="23456">
<color-id>23456</color-id>
<name>Green</name>
</color>
<color id="34567">
<color-id>34567</color-id>
<name>Red</name>
</color>
</colors>
</Maininfo>
</styles>
</detail>
我正在尝试构建一个文件,其中每个颜色 ID 和名称与 info1、info2、info3 字段组合在一起。例如,我需要设法用这些信息得出 4 个不同的组。
- 第 1 组 = 组 1、测试 1、测试 2、测试 3、1234567、54321、测试颜色
- 组 2 = 组 2、测试 4、测试 5、测试 6、7654321、12345、黄色
- 组 3 = 组 2、测试 4、测试 5、测试 6、7654321、23456、绿色
- 组 4 = 组 2、测试 4、测试 5、测试 6、7654321、34567、红色
我可以获取颜色和所有内容,但我似乎无法获取它之前的信息。
这就是我用来获取颜色和颜色 ID 的方法。
var xml = Xdocument.Load("test.xml");
var color = from c in xml.Root.Descendants("color")
select new{
colorNumber = (string)c.Element("color-id"),
colorName = (string)c.Element("name"),
};
我尝试了很多不同的方法来获取与之匹配的信息,但我就是想不通。我希望我解释得足够好。
我在这个网站上四处寻找与我所问的类似的东西,但我找不到任何东西。有人可以帮忙吗?
很难想出这个问题的主题。对不起,如果它误导了。
谢谢
如果我正确理解了您的需求,那么类似这样的内容应该适用于您的示例。您可以使用找到的 color
元素中的 Parent
属性 遍历树并将其与您想要的其他信息配对。
var colorGroups = xml
.Descendants("color")
.Select(colorElement =>
{
XElement mainInfo = colorElement.Parent.Parent;
return new
{
Set = mainInfo.Attribute("id").Value,
Color = colorElement.Element("name").Value,
Id = colorElement.Element("color-id").Value,
SecondInfo = mainInfo.Element("secondinfo").Elements("secondinfo-base").Select(b => b.Attribute("id").Value).ToList(),
Infos = mainInfo.Elements().Where(b => b.Name.LocalName.StartsWith("info")).Select(b => b.Value).ToList()
};
});
这会生成可枚举的动态类型对象。要访问此信息,您可以这样做,例如,
foreach (var colorGroup in colorGroups)
{
Console.WriteLine(colorGroup.Set);
}
由于它们是动态类型的,因此您不会对 Visual Studio 中的 属性 名称具有智能感知,但它仍会在运行时编译和工作。我返回了动态对象以遵循您的原始代码,但您可以在此处使用真正的 class (我个人更喜欢这个,事实上我可能会想将整个对象反序列化为一组对象,因为看起来您'无论如何,我都会使用大部分信息,这样使用起来会更容易,也更易读,但它超出了我想在这里介绍的内容)。
<?xml version="1.0" encoding="ISO-8859-1"?>
<detail id="TestXML">
<styles>
<Maininfo id="Set1">
<info1>Test1</info1>
<info2>Test2</info2>
<info2>Test3</info2>
<secondinfo>
<secondinfo-base id="1234567">
<description>BlahBlah</description>
<quantity>1</quantity>
</secondinfo-base>
</secondinfo>
<colors>
<color id="54321">
<color-id>54321</color-id>
<name>Test Color</name>
</color>
</colors>
</Maininfo>
</styles>
<styles>
<Maininfo id="Set2">
<info1>Test4</info1>
<info2>Test5</info2>
<info2>Test6</info2>
<secondinfo>
<secondinfo-base id="7654321">
<description>BlahBlahandBlah</description>
<quantity>2</quantity>
</secondinfo-base>
</secondinfo>
<colors>
<color id="12345">
<color-id>12345</color-id>
<name>Yellow</name>
</color>
<color id="23456">
<color-id>23456</color-id>
<name>Green</name>
</color>
<color id="34567">
<color-id>34567</color-id>
<name>Red</name>
</color>
</colors>
</Maininfo>
</styles>
</detail>
我正在尝试构建一个文件,其中每个颜色 ID 和名称与 info1、info2、info3 字段组合在一起。例如,我需要设法用这些信息得出 4 个不同的组。
- 第 1 组 = 组 1、测试 1、测试 2、测试 3、1234567、54321、测试颜色
- 组 2 = 组 2、测试 4、测试 5、测试 6、7654321、12345、黄色
- 组 3 = 组 2、测试 4、测试 5、测试 6、7654321、23456、绿色
- 组 4 = 组 2、测试 4、测试 5、测试 6、7654321、34567、红色
我可以获取颜色和所有内容,但我似乎无法获取它之前的信息。
这就是我用来获取颜色和颜色 ID 的方法。
var xml = Xdocument.Load("test.xml");
var color = from c in xml.Root.Descendants("color")
select new{
colorNumber = (string)c.Element("color-id"),
colorName = (string)c.Element("name"),
};
我尝试了很多不同的方法来获取与之匹配的信息,但我就是想不通。我希望我解释得足够好。
我在这个网站上四处寻找与我所问的类似的东西,但我找不到任何东西。有人可以帮忙吗?
很难想出这个问题的主题。对不起,如果它误导了。
谢谢
如果我正确理解了您的需求,那么类似这样的内容应该适用于您的示例。您可以使用找到的 color
元素中的 Parent
属性 遍历树并将其与您想要的其他信息配对。
var colorGroups = xml
.Descendants("color")
.Select(colorElement =>
{
XElement mainInfo = colorElement.Parent.Parent;
return new
{
Set = mainInfo.Attribute("id").Value,
Color = colorElement.Element("name").Value,
Id = colorElement.Element("color-id").Value,
SecondInfo = mainInfo.Element("secondinfo").Elements("secondinfo-base").Select(b => b.Attribute("id").Value).ToList(),
Infos = mainInfo.Elements().Where(b => b.Name.LocalName.StartsWith("info")).Select(b => b.Value).ToList()
};
});
这会生成可枚举的动态类型对象。要访问此信息,您可以这样做,例如,
foreach (var colorGroup in colorGroups)
{
Console.WriteLine(colorGroup.Set);
}
由于它们是动态类型的,因此您不会对 Visual Studio 中的 属性 名称具有智能感知,但它仍会在运行时编译和工作。我返回了动态对象以遵循您的原始代码,但您可以在此处使用真正的 class (我个人更喜欢这个,事实上我可能会想将整个对象反序列化为一组对象,因为看起来您'无论如何,我都会使用大部分信息,这样使用起来会更容易,也更易读,但它超出了我想在这里介绍的内容)。