使用 LINQ to XML 解析深层嵌套属性时遇到问题

发布于 2024-09-18 13:09:58 字数 518 浏览 4 评论 0原文

我一直在尝试在 c# 中解析此 xml

<schema uri=http://blah.com/schema >
   <itemGroups>
     <itemGroup description="itemGroup1 label="itemGroup1">
       <items>
        <item description="The best" itemId="1" label="Nutella"/>
        <item description="The worst" itemId="2" label="Vegemite"/>
       </items>
     </itemGroup>
   </itemGroups>
</schema>

\itemGroup1\Nutella-The best
\itemGroup1\Vegemite-The worst

任何帮助或指导将不胜感激。

I have been trying to parse this xml in c#

<schema uri=http://blah.com/schema >
   <itemGroups>
     <itemGroup description="itemGroup1 label="itemGroup1">
       <items>
        <item description="The best" itemId="1" label="Nutella"/>
        <item description="The worst" itemId="2" label="Vegemite"/>
       </items>
     </itemGroup>
   </itemGroups>
</schema>

\itemGroup1\Nutella-The best
\itemGroup1\Vegemite-The worst

Any help or direction would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

束缚m 2024-09-25 13:09:58
XDocument xDoc = XDocument.Load(myXml); //load your XML from file or stream

var rows = xDoc.Descendants("item").Select(x => string.Format(
                    @"\{0}-{1}\{2}-{3}",
                    x.Ancestors("itemGroup").First().Attribute("description").Value,
                    x.Ancestors("itemGroup").First().Attribute("label").Value,
                    x.Attribute("label").Value,
                    x.Attribute("description").Value));

让我们分解一下我们正在做的事情:

  • xDoc.Descendants("item") 获取整个文档中的所有 元素

  • Select(x => string.Format( format, args) 将我们从最后一个操作中获得的每个 投影为我们在 lambda 中指定的任何格式。 href="http://msdn.microsoft.com/en-us/library/b1csw23d.aspx" rel="nofollow noreferrer">格式化字符串。

  • 就 XML 树而言 。 ,我们“坐在” 级别,因此我们需要回滚树以使用 Ancestors 获取父组的数据。由于该方法返回一个元素序列,因此我们知道我们需要第一个(离我们最近的),以便我们可以读取它的属性。

现在您有了一个 IEnumerable,XML 文档中的每个 都有一个,并且信息采用您指定的格式:

foreach(string row in rows)
{
    Console.WriteLine(row);
}
XDocument xDoc = XDocument.Load(myXml); //load your XML from file or stream

var rows = xDoc.Descendants("item").Select(x => string.Format(
                    @"\{0}-{1}\{2}-{3}",
                    x.Ancestors("itemGroup").First().Attribute("description").Value,
                    x.Ancestors("itemGroup").First().Attribute("label").Value,
                    x.Attribute("label").Value,
                    x.Attribute("description").Value));

Let's break down what we're doing:

  • xDoc.Descendants("item") gets us all <item> elements in the entire document

  • Select(x => string.Format(format, args) projects each <item> we got from the last operation into whatever format we specify in the lambda. In this case, a formatted string.

  • In terms of the XML tree, we're "sitting at" the <item> level, so we need to roll back up the tree to get the data for the parent group using Ancestors. Since that method returns a sequence of elements, we know we want the first (nearest to us) so we can read its attribute.

Now you have an IEnumerable<string>, one for each <item> in your XML document and the information in the format you specified:

foreach(string row in rows)
{
    Console.WriteLine(row);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文