【问题标题】:XmlDocument - SelectNodesXmlDocument - 选择节点
【发布时间】:2015-10-22 20:20:37
【问题描述】:

我已经尝试了几种不同的方法,但没有太多的外观,我希望有人能够提供帮助:-)

XML:

<?xml version="1.0" encoding="UTF-8"?>
<ListOrdersResponse xmlns="https://services.com/Orders/2013-09-01">
   <ListOrdersResult>
      <Orders>
         <Order>
            <Id>1</Id>
         </Order>
         <Order>
            <Id>2</Id>
         </Order>
      </Orders>
   </ListOrdersResult>
</ListOrdersResponse>

试过了:

var o =xmlDocument.SelectNodes("/ListOrdersResponse/ListOrdersResult/Orders/Order");
var o = xmlDocument.SelectNodes("/ListOrdersResponse/ListOrdersResult/Orders");
var o = xmlDocument.SelectNodes("//Orders");
var o = xmlDocument.SelectNodes("//Order");
var o = xmlDocument.SelectNodes("//Orders/Order");

var root = xmlDocument.DocumentElement;
var nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
nsmgr.AddNamespace("bk", "https://services.com/Orders/2013-09-01");
var orders = root.SelectNodes("descendant::bk:Orders/Order", nsmgr);

var root = xmlDocument.DocumentElement;
var nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
nsmgr.AddNamespace("bk", "https://services.com/Orders/2013-09-01");
var orders = root.SelectNodes("descendant::bk:Orders", nsmgr);

它只返回 0 条记录。 :-(

我做错了什么?

【问题讨论】:

  • 您能否详细说明您要达到的目标?

标签: c# xml xmldocument selectnodes


【解决方案1】:

使用 Linq2Xml 怎么样?我觉得它更容易使用。

XNamespace ns = "https://services.com/Orders/2013-09-01";
var orders = XDocument.Load(filename)
            .Descendants(ns + "Order")
            .Select(x => (int)x.Element(ns + "Id"))
            .ToList();

PS:Xml 区分大小写。检查有问题的样品。 &lt;Order&gt;&lt;/order&gt; 等。

【讨论】:

  • 那么将我的 XMLDoument.InnerText 加载到 XDocument.Load 中?
  • @ClareBarrington 以上示例不完整。它从文件加载 xml 并解析它。不需要 XmlDocument。 (顺便说一句:如果你想从字符串加载它,请使用XDocument.Parse(xmlstring))。
  • @ClareBarrington 一般来说,除非您有令人信服的理由不这样做,否则更喜欢 LINQ 到 XML (XDocument) 到 XmlDocument。这是一个更好的 API。我也更喜欢 LINQ to XML 查询方法而不是 XPath - 同样,除非您有令人信服的理由不这样做。
  • 我喜欢这个:var results = doc.Descendants().Where(x => x.Name.LocalName == "Orders").Select(x => new { id = x.Descendants ().Where(y => y.Name.LocalName == "Id").Select(z => (int)z) }).SelectMany(x => x.id).ToList();
【解决方案2】:

var nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
nsmgr.AddNamespace("bk", "https://services.com/Orders/2013-09-01");

部分是正确的,但是您需要使用前缀 bk 来限定 XPath 表达式中的所有元素名称,例如

XmlNodeList orders = xmlDocument.SelectNodes("//bk:Orders/bk:Order", nsmgr);
foreach (XmlElement order in orders) {
  Console.WriteLine(order.SelectSingleNode("bk:Id", nsmgr).InnerText);
}

【讨论】:

  • 由于 XmlDocument - XDocument 没有转换,因此在上面的答案中选择了这个
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多