使用C#读取XML并将信息分组在一起

时间:2016-06-21 16:21:00

标签: c# xml linq linq-to-xml

<?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项,第6期,第7654321期,第23456页,绿色
  • 第4组=第2组,第4组,第5组,第6组,第7654321号,第345组,红色

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

我正在做的是获取颜色和颜色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"),
                            };

我已经尝试了很多不同的方法来获取与之配对的信息,但我无法弄明白。我希望我能够很好地解释这一点。

我在这个网站上看了很多东西,类似于我所问的东西,但我找不到任何东西。有人可以帮忙吗?

很难想到这个问题的主题。对不起,如果它有误导性。

由于

1 个答案:

答案 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中的属性名称,但它仍然可以在运行时编译和工作。我返回动态对象来跟随你的原始代码,但你可以在这里使用真正的类(我个人更喜欢这个,事实上我可能想把整个反序列化为一组对象,因为它似乎你正在使用大部分无论如何,信息更容易使用,更易读,但这比我想要进入的更多。