【问题标题】:Reading XML with C# and grouping Information together使用 C# 读取 XML 并将信息分组在一起
【发布时间】:2016-06-21 16:21:00
【问题描述】:
<?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、Test1、Test2、Test3、1234567、54321、测试颜色
  • 第 2 组 = 第 2 组、Test4、Test5、Test6、7654321、12345、黄色
  • 第 3 组 = 第 2 组、Test4、Test5、Test6、7654321、23456、绿色
  • 第 4 组 = 第 2 组、Test4、Test5、Test6、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"),
                            };

我尝试了很多不同的方法来获取与之配对的信息,但我就是想不通。我希望我解释得足够好。

我在这个网站上四处寻找与我所要求的类似的东西,但我找不到任何东西。有人可以帮忙吗?

很难为这个问题想出一个主题。如有误导,请见谅。

谢谢

【问题讨论】:

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


    【解决方案1】:

    如果我正确理解了您的需求,那么这样的内容应该适用于您的示例。您可以使用您找到的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 中的属性名称有智能感知,但它仍会在运行时编译和工作。我返回了动态对象以遵循您的原始代码,但是您可以在这里使用一个真正的类(我个人更喜欢这个,事实上我可能很想将整个对象反序列化为一组对象,因为您似乎正在使用大部分无论如何,这些信息会更容易使用且更具可读性,但这比我想在这里介绍的要多。

    【讨论】:

    • 这有帮助。我没有意识到我可以做 Parent.Parent。正因为如此,我有一个现在可以使用的版本。我这样说是因为我遇到了一个包含多个“secondinfo-base”条目的 xml 文件,而我只能显示第一个条目。此外,这可能是一个愚蠢的问题,但是您如何访问通过代码提取的信息?
    • @Matt,见编辑,这应该处理多个 secondinfo-base 元素。我已经举了一个例子,说明如何从结果分组中提取信息。
    • 我明白了。非常感谢。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多