使用 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 个不同的组。

我可以获取颜色和所有内容,但我似乎无法获取它之前的信息。

这就是我用来获取颜色和颜色 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 (我个人更喜欢这个,事实上我可能会想将整个对象反序列化为一组对象,因为看起来您'无论如何,我都会使用大部分信息,这样使用起来会更容易,也更易读,但它超出了我想在这里介绍的内容)。