尽管有 XmlNamespaceManager,XPathNavigator 还是找不到节点
XPathNavigator can't find nodes despite XmlNamespaceManager
我不想问另一个 XPath/XmlNamespaceManager 问题,但我似乎无法弄清楚。
我使用了 XpathVisualizer 工具,它可以使用 XPath“//FuelGradeMovement”正确检测节点。它识别名称空间并像那样评估 XPath。
我只想检查节点“FuelGradeMovement”是否存在。很容易。但是不行,不行。
很明显,我正在 xpath 的节点甚至没有前缀,但如果我不使用命名空间管理器,我会收到运行时错误,因为文档中的其他节点确实有前缀。
并且对于命名空间,它只是出于某种原因看不到节点。
我正在尝试解析此文档:
<?xml version="1.0"?>
<NAXML-MovementReport version="3.4" xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16" xmlns:radiant="http://www.radiantsystems.com/NAXML-Extension" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.naxml.org/POSBO/Vocabulary/2003-10-16 NAXML-PBI34RadiantExtended.xsd">
<TransmissionHeader>....
</TransmissionHeader>
<FuelGradeMovement/>
</NAXML-MovementReport>
使用此代码:
using ( var fs = file.OpenRead() )
{
var x = new XPathDocument( fs );
var nav = x.CreateNavigator();
var mgr = new XmlNamespaceManager( nav.NameTable );
mgr.AddNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
mgr.AddNamespace( "xmime", "http://www.w3.org/2005/05/xmlmime" );
mgr.AddNamespace( "radiant", "http://www.radiantsystems.com/NAXML-Extension" );
mgr.AddNamespace( "ns1", "http://www.naxml.org/POSBO/Vocabulary/2003-10-16" );
var iterator = nav.Select( "//FuelGradeMovement", mgr );
return iterator.Count > 0;
}
我尝试了很多组合,但我没有发现我的错误。
有人可以帮忙吗?
谢谢!
您正在指定名称空间管理器 - 但不是名称空间。 FuelGradeMovement
元素从其父元素继承了 "http://www.naxml.org/POSBO/Vocabulary/2003-10-16"
名称空间 URI,因此我相信您想要:
var iterator = nav.Select("//ns1:FuelGradeMovement", mgr);
元素没有指定命名空间前缀并不意味着它不在命名空间中。
请注意,除非您真的想要复杂的 XPath 查询,否则 LINQ to XML 会使所有这些变得简单得多。例如:
var doc = XDocument.Load(fs);
XNamespace ns = "http://www.naxml.org/POSBO/Vocabulary/2003-10-16";
return doc.Descendants(ns + "FuelGradeMovement").Any();
我不想问另一个 XPath/XmlNamespaceManager 问题,但我似乎无法弄清楚。
我使用了 XpathVisualizer 工具,它可以使用 XPath“//FuelGradeMovement”正确检测节点。它识别名称空间并像那样评估 XPath。
我只想检查节点“FuelGradeMovement”是否存在。很容易。但是不行,不行。
很明显,我正在 xpath 的节点甚至没有前缀,但如果我不使用命名空间管理器,我会收到运行时错误,因为文档中的其他节点确实有前缀。
并且对于命名空间,它只是出于某种原因看不到节点。
我正在尝试解析此文档:
<?xml version="1.0"?>
<NAXML-MovementReport version="3.4" xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16" xmlns:radiant="http://www.radiantsystems.com/NAXML-Extension" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.naxml.org/POSBO/Vocabulary/2003-10-16 NAXML-PBI34RadiantExtended.xsd">
<TransmissionHeader>....
</TransmissionHeader>
<FuelGradeMovement/>
</NAXML-MovementReport>
使用此代码:
using ( var fs = file.OpenRead() )
{
var x = new XPathDocument( fs );
var nav = x.CreateNavigator();
var mgr = new XmlNamespaceManager( nav.NameTable );
mgr.AddNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
mgr.AddNamespace( "xmime", "http://www.w3.org/2005/05/xmlmime" );
mgr.AddNamespace( "radiant", "http://www.radiantsystems.com/NAXML-Extension" );
mgr.AddNamespace( "ns1", "http://www.naxml.org/POSBO/Vocabulary/2003-10-16" );
var iterator = nav.Select( "//FuelGradeMovement", mgr );
return iterator.Count > 0;
}
我尝试了很多组合,但我没有发现我的错误。 有人可以帮忙吗?
谢谢!
您正在指定名称空间管理器 - 但不是名称空间。 FuelGradeMovement
元素从其父元素继承了 "http://www.naxml.org/POSBO/Vocabulary/2003-10-16"
名称空间 URI,因此我相信您想要:
var iterator = nav.Select("//ns1:FuelGradeMovement", mgr);
元素没有指定命名空间前缀并不意味着它不在命名空间中。
请注意,除非您真的想要复杂的 XPath 查询,否则 LINQ to XML 会使所有这些变得简单得多。例如:
var doc = XDocument.Load(fs);
XNamespace ns = "http://www.naxml.org/POSBO/Vocabulary/2003-10-16";
return doc.Descendants(ns + "FuelGradeMovement").Any();