<?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个不同的组。
我可以获得颜色和所有内容,但我似乎无法获得它之前的信息。
我正在做的是获取颜色和颜色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"),
};
我已经尝试了很多不同的方法来获取与之配对的信息,但我无法弄明白。我希望我能够很好地解释这一点。
我在这个网站上看了很多东西,类似于我所问的东西,但我找不到任何东西。有人可以帮忙吗?
很难想到这个问题的主题。对不起,如果它有误导性。
由于
答案 0 :(得分:0)
如果我理解你需要的东西,这样的东西应该适用于你的例子。您可以使用找到的Parent
元素的color
属性遍历树并将其与您想要的其他信息配对。
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中的属性名称,但它仍然可以在运行时编译和工作。我返回动态对象来跟随你的原始代码,但你可以在这里使用真正的类(我个人更喜欢这个,事实上我可能想把整个反序列化为一组对象,因为它似乎你正在使用大部分无论如何,信息更容易使用,更易读,但这比我想要进入的更多。