我有一个带有默认命名空间的XML文档.我正在使用XPathNavigator使用Xpath选择一组节点,如下所示:
XmlElement myXML = ...;
XPathNavigator navigator = myXML.CreateNavigator();
XPathNodeIterator result = navigator.Select("/outerelement/innerelement");
Run Code Online (Sandbox Code Playgroud)
我没有得到任何结果:我假设这是因为我没有指定命名空间.如何在我的选择中包含命名空间?
什么是XPath(在C#API中XDocument.XPathSelectElements(xpath,nsman),如果重要的话)查询此文档中的所有MyNode?
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<MyNode xmlns="lcmp" attr="true">
<subnode />
</MyNode>
</configuration>
Run Code Online (Sandbox Code Playgroud)
/configuration/MyNode这是错误的,因为它忽略了命名空间./configuration/lcmp:MyNode哪个是错的,因为lcmp是URI,而不是前缀./configuration/{lcmp}MyNode哪个失败了因为Additional information: '/configuration/{lcmp}MyNode' has an invalid token.编辑:我不能mgr.AddNamespace("df", "lcmp");像一些回答者所建议的那样使用.这要求XML解析程序知道我计划提前使用的所有命名空间.由于这适用于任何源文件,我不知道手动添加前缀的命名空间.它似乎{my uri}是XPath语法,但微软并没有打算实现那个......是真的吗?
XPath背后的故事是什么以及对名称空间的支持?XPath作为规范在命名空间之前吗?如果我有一个文档,其中元素已被赋予默认命名空间:
<foo xmlns="uri" />
Run Code Online (Sandbox Code Playgroud)
似乎某些XPath处理器库//foo由于名称空间而无法识别,而其他库将会识别.我的团队所考虑的选项是使用正则表达式向XPath添加名称空间前缀(可以通过XmlNameTable添加名称空间前缀),但这似乎很脆弱,因为在节点测试时XPath是一种非常灵活的语言.
是否有适用于此的标准?
我的方法有点hackish但似乎工作正常; 我xmlns用搜索/替换删除声明,然后应用XPath.
string readyForXpath = Regex.Replace(xmldocument, "xmlns=\".+\"", String.Empty );
Run Code Online (Sandbox Code Playgroud)
这是一种公平的方法还是有人以不同方式解决了这个问
有没有办法将Java的XPath设置为表达式的默认名称空间前缀?例如,代替:/ html:html/html:head/html:title/text()",查询可以是:/ html/head/title/text()
使用命名空间前缀时,必须有一种更优雅的方式.
我现在正在做的示例代码片段:
Node node = ... // DOM of a HTML document
XPath xpath = XPathFactory.newInstance().newXPath();
// set to a NamespaceContext that simply returns the prefix "html"
// and namespace URI ""http://www.w3.org/1999/xhtml"
xpath.setNamespaceContext(new HTMLNameSpace());
String expression = "/html:html/html:head/html:title/text()";
String value = xpath.evaluate(query, expression);
Run Code Online (Sandbox Code Playgroud) 简单的问题,我只想从<Template>标签中选择文本.这就是我所拥有的,但Xpath与任何东西都不匹配.
public static void TestXPath()
{
string xmlText = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
xmlText += "<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">";
xmlText += "<Template>Normal</Template> <TotalTime>1</TotalTime> <Pages>1</Pages> <Words>6</Words>";
xmlText += "</Properties>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(new System.IO.StringReader(xmlText));
foreach (XmlNode node in xmlDoc.SelectNodes("//Template"))
{
Console.WriteLine("{0}: {1}", node.Name, node.InnerText);
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个带有命名空间的XML文档,我想用XPath提取一些节点.
这是文件:
<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<anyType xsi:type="Document">
<Id>5</Id>
<Title>T1</Title>
</anyType>
<anyType xsi:type="Document">
<Id>15</Id>
<Title>T15</Title>
</anyType>
</ArrayOfAnyType>
Run Code Online (Sandbox Code Playgroud)
如果我想用xsi:type ="Document"提取所有"anyType"元素,XPath表达式会是什么?
我试过这个:
//anyType[@xsi:type="Document"]
Run Code Online (Sandbox Code Playgroud)
它不起作用:
我正在使用包含类似于此的结构的XML文档:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
Run Code Online (Sandbox Code Playgroud)
我目前正以这种方式将文件从文件加载到XML文档中:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行下一行代码时,我遇到了一个问题,只有这个特定的文档:
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
Run Code Online (Sandbox Code Playgroud)
我是否在正确的轨道上猜测这是因为使用名为'id'的属性的问题或者我在代码中遗漏了某些内容而返回null?
我有一个XML文件,它具有以下结构:
<mediawiki ...>
<siteinfo>...</siteinfo>
<page>
<title>The Title</title>
<id>42</id>
...
</page>
... more page items ...
</mediawiki>
Run Code Online (Sandbox Code Playgroud)
我稍微了解一下XPath-Query并编写了以下代码:
_xmlArticlesDocument = new XmlDocument();
_xmlArticlesDocument.Load(xmlArticlesFileName);
Run Code Online (Sandbox Code Playgroud)
现在我想抓住一个具有给定id-Subelement的页面元素.所以我写道:
XmlNode node = _xmlArticlesDocument.DocumentElement.SelectSingleNode
("//mediawiki/page[id=" + id.ToString() + "]");
Run Code Online (Sandbox Code Playgroud)
但节点始终为空.我已经尝试了几个查询,包括"page/id","page","/ page","// page"来获取任何内容,但节点始终为null.我通过快速检查检查了_xmlArticlesDocument变量,它包含具有预期结构的正确XML文件.
在我看来,我错过了一些非常基本的东西,但不知道是什么.也许这里有人有想法?
先谢谢你,弗兰克
我有以下XPATH行:
// DET [@ nItem域= "1"]/PROD/cProd
这成功地使用XPath Visualizer选择了所需的节点,它自动识别命名空间,并定义要选择的命名空间.
当我使用以下XPATH代码在C#中指定命名空间时:
"http://www.portalfiscal.inf.br/nfe//det[@nItem=\"1\"]/prod/cProd"
Run Code Online (Sandbox Code Playgroud)
它给了我一个XPathException:
System.Xml.dll中发生未处理的"System.Xml.XPath.XPathException"类型异常附加信息:' http : //www.portalfiscal.inf.br/nfe//det[@ nItem = "1"]/prod/cProd'的名字无效.
(正如你所看到的,它不是任何逃避角色或任何东西,因为它给了我在异常中试图达到的东西)
如果我知道XPath的命名空间,我该如何正确选择这个节点?
- [编辑] - 我尝试读取节点的完整行:
doc.XPathSelectElement("http://www.portalfiscal.inf.br/nfe//det[@nItem=\"1\"]/prod/cProd").Value;
Run Code Online (Sandbox Code Playgroud)
并且XML中包含了不必要的东西:
<?xml version="1.0" encoding="utf-8"?>
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">
<idLote>1</idLote>
<NFe>
<infNFe versao="1.10" Id="NFe31100118583682000178550010000077778397333128">
<det nItem="1">
<prod>
<cProd>111</cProd>
</prod>
</det>
</infNFe>
</NFe>
</enviNFe>
Run Code Online (Sandbox Code Playgroud)
(不必要的东西不应该是一个问题,因为XPath Visualizer给我带来了完全没有问题的节点)