Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xml通过XmlNamespaceManager选择默认命名空间的节点未按预期工作_C#_.net_Unit Testing_Xpath - Fatal编程技术网

C# Xml通过XmlNamespaceManager选择默认命名空间的节点未按预期工作

C# Xml通过XmlNamespaceManager选择默认命名空间的节点未按预期工作,c#,.net,unit-testing,xpath,C#,.net,Unit Testing,Xpath,我有一些默认名称空间的xml <a xmlns='urn:test.Schema'><b/><b/></a> 这样断言就变为真了 到目前为止,我已经尝试过(使用nunit): [测试] [忽略(“为什么不起作用?”)] public void\u\u不工作\u TestSelectWithDefaultNamespace() { //使用defaultnamespace解析的xml 字符串xml=@; XmlDocument doc=新的XmlD

我有一些默认名称空间的xml

<a xmlns='urn:test.Schema'><b/><b/></a>
这样断言就变为真了

到目前为止,我已经尝试过(使用nunit):

[测试]
[忽略(“为什么不起作用?”)]
public void\u\u不工作\u TestSelectWithDefaultNamespace()
{
//使用defaultnamespace解析的xml
字符串xml=@;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xml);
//失败,因为xpath没有命名空间
//!!!!
Assert.AreEqual(2,doc.SelectNodes(“//b”).Count);
//使用XPathDefaultNamespace
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace(“,“urn:test.Schema”);
//在Dotnet3.5sp1中,这将失败。为什么?
//!!!!
Assert.AreEqual(2,doc.SelectNodes(“//b”,nsmgr.Count);
}
[测试]
public void testselectwithoutnamespace_Ok()
{
//无名称空间解析的xml
字符串xml=@;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xml);
//行吗
Assert.AreEqual(2,doc.SelectNodes(“//b”).Count);
//行吗
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(doc.NameTable);
Assert.AreEqual(2,doc.SelectNodes(“//b”,nsmgr.Count);
}
[测试]
public void TestSelectWithNamespacesPrefixed_Ok()
{
//使用defaultnamespace解析的xml
字符串xml=@;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xml);
//通过别名“t”使用XPath命名空间可以正常工作,但XPath太复杂了
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace(“t”,doc.DocumentElement.NamespaceURI);
AreEqual(2,doc.SelectNodes(//t:b,nsmgr.Count);
}
这是一个常见问题解答。在XPath中,任何未固定的名称都假定位于“无命名空间”中。为了选择属于名称空间的元素,在任何XPath表达式中,它们的名称必须以与此名称空间关联的前缀作为前缀。
AddNamespace()
方法正好用于此目的。它在特定名称空间和特定前缀之间创建绑定。然后,如果在XPath表达式中使用此前缀,则可以选择以其为前缀的元素

它写在中:“节点测试中的QName使用表达式上下文中的命名空间声明扩展为扩展名称。这与在开始和结束标记中对元素类型名称进行扩展的方式相同,只是没有使用用xmlns声明的默认名称空间:如果QName没有前缀,则名称空间URI为null”

请参见:

因此,任何不固定的名称都被视为在“无名称空间”中。在提供的XML文档中,“无名称空间”中没有
b
元素,这就是XPath表达式
//b
根本不选择节点的原因

使用

XmlNamespaceManager nsmanager = new XmlNamespaceManager(doc.NameTable);
nsmanager.AddNamespace("x", "urn:test.Schema");
Assert.AreEqual(2, doc.SelectNodes("//x:b", nsmanager).Count);
及更高版本

XmlNamespaceManager nsmanager = new XmlNamespaceManager(doc.NameTable);
nsmanager.AddNamespace("x", "urn:test.Schema");
Assert.AreEqual(2, doc.SelectNodes("//x:b", nsmanager).Count);

记住:注册名称空间的全部目的是能够在任何XPath表达式中使用前缀(在本例中为
x
)。

感谢您的回复。您描述的内容与第三个unitest TestSelectWithNamespacesPrefixed_Ok()相同我仍然希望有一个无需修改xpath的解决方案-expression@k3b:您写道:我仍然希望有一个无需修改xpath表达式的解决方案。否。这是常见问题解答:不带前缀的QName测试将选择null(或空)中的元素命名空间URI,不在默认命名空间中。@k3B:不,没有这样的解决方法——它是在XPath W3C规范中编写的:“使用表达式上下文中的命名空间声明将节点测试中的QName扩展为扩展名。这与在开始和结束标记中对元素类型名称进行扩展的方式相同,只是没有使用用xmlns声明的默认命名空间:如果QName没有前缀,则命名空间URI为null“请参见:。因此,任何未固定的名称都被视为在“无命名空间”中。中没有
b
元素”“没有名称空间”,您会得到0个节点+1个很好的答案。@Alejandro,@Dimitre,@k3b-正如@Alejandro之前所提到的,上面关于没有前缀的QName测试的陈述只适用于XPath 1.0。在2.0中,“一个不固定的QName…”。。。在表达式上下文“()中具有默认元素/类型命名空间的命名空间URI这在C#应用程序中没有帮助,因为XPath 2.0不可用。但我想避免有人读到上面的内容,得出没有XPath版本允许使用默认名称空间的结论。@LarsH:谢谢你这么说。我不想提及这一点,因为即使在XPath 2.0中,也没有任何方法设置默认名称空间XPath语言中的t名称空间——静态上下文的项只能由宿主语言设置——这与XPath 1.0的当前情况没有太大区别——唯一的进步是,在宿主语言中注册名称空间时,可以指定一个名称空间作为默认名称空间,这意味着不固定的元素名称在此默认命名空间中,而不是在“无命名空间”中。
Assert.AreEqual(2, doc.SelectNodes("//x:b", nsmanager).Count);