【问题标题】:Parsing nested XML解析嵌套的 XML
【发布时间】:2017-03-27 17:07:33
【问题描述】:

这似乎是一项非常基本的任务,我想知道我是否使用了错误的搜索词,因为我没有找到解决方案...

我有一个非常简单的嵌套 XML:

<books>
    <book>
        <author>Douglas Adams</author>
        <title>The Hitch Hikers Guide to the Galaxy</title>
        <price>42</price>
    </book>
</books>

我是获取XMl内容返回到流中的Web API,以变量xmlStream中的上述粘贴内容结束:

var xmlStream = response.Content.ReadAsStreamAsync().Result;
var xmlDocument = new XmlDocument();

xmlDocument.Load(xmlStream);

Console.WriteLine("Title:");
// Do something to get the value of 'title'
Console.WriteLine(xmlDocument.someTraversion...);

由于我没有经常使用 XML,我不确定如何遍历 title 属性

我阅读了有关XPath 的信息,并试图了解如何使用navigate the DOM tree。恐怕我不明白术语nodeschild。非常感谢任何帮助:-)

【问题讨论】:

  • 我不介意被否决,但希望对我的问题中的改进之处发表评论:-)
  • 就术语而言,“子”是指位于另一个元素内的元素。在这种情况下,AuthorBook 的子代,BooksBooks 的子代。从Books来看,Author不是孩子,而是祖先。 “节点”是 XML 的任何语法部分,整个文档是一个节点,单个元素是一个节点,一个属性是一个节点,等等。
  • 非常感谢@BradleyUffner!这现在更有意义了:-)

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


【解决方案1】:

使用LINQ of XML

XElement document = null;
using (var stream = await response.Content.ReadAsStreamAsync())
{
   document = XElement.Load(stream);
}

foreach(var book in document.Descendants("book"))
{
    var title = book.Element("title").Value;
    // use title
}

请注意,使用 ReadAsStreamAsync().Result 可能会引发死锁错误 - 使用“正确”等待方法

var result = await ReadAsStreamAsync();

【讨论】:

  • 非常感谢法比奥的帮助!我收到以下错误消息:XmlElement 不包含“加载”的定义
  • XDocumentXElement 应该是 XmlDocumentXmlElement 对吧?
  • @jrn ,没有。 XDocument 是 System.Xml.Linq 的类。
  • 知道了!我只需要将XDocument document = null; 更改为XElement document = null;。非常感谢您的帮助@Fabio! :-)
  • 另外,非常感谢您指出可能的死锁错误!我相应地更改了我的代码!欣赏它:-)
猜你喜欢
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多