XPathNavigator可以从测试输入中选择,但不能从实际输入中选择

时间:2018-11-04 21:09:37

标签: c# .net xml xpath xpathnavigator

这是我的XML,通过将s打印到控制台获得,如下代码所示:

func1

这是我的代码:

objectives: {
    enemies: [
        name: {
            type: String,
            required: true
        },
        health: {
            type: number,
            required: true
        }
    ]
}

这将选择0个元素。为什么?

如果我取消注释将serviceListXml设置为测试字符串的行,它将发现3个元素如预期的那样。我以为真实的XML上可能有BOM,所以我尝试使用<?xml version="1.0" encoding="utf-8"?> <service xml:base="https://fnord/live/api/v1" xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title type="text">Service List</atom:title> <collection href="Erp.BO.ABCCodeSvc"> <atom:title type="text">Erp.BO.ABCCodeSvc</atom:title> </collection> <collection href="Erp.BO.AccountBudgetSvc"> <atom:title type="text">Erp.BO.AccountBudgetSvc</atom:title> </collection> <collection href="Erp.BO.ACTTypeSvc"> <atom:title type="text">Erp.BO.ACTTypeSvc</atom:title> </collection> <!-- hundreds more collection elements --> </workspace> </service> ,但这没什么区别。

1 个答案:

答案 0 :(得分:1)

这是因为在您的原始XML集合中,它位于http://www.w3.org/2007/app命名空间中,该命名空间是该XML的默认命名空间。为了能够选择collection元素,您有两个选择:

选项1:将名称空间传递到您的XPathDocument中,例如:

var ns = new XmlNamespaceManager(nav.NameTable);
ns.AddNamespace("ns", "http://www.w3.org/2007/app");
var foo = nav.Select("//ns:collection", ns);

选项2:使用此XPath:var foo = nav.Select("//*[local-name() = 'collection']");