相关疑难解决方法(0)

在C#中使用带有默认命名空间的Xpath

我有一个带有默认命名空间的XML文档.我正在使用XPathNavigator使用Xpath选择一组节点,如下所示:

XmlElement myXML = ...;  
XPathNavigator navigator = myXML.CreateNavigator();
XPathNodeIterator result = navigator.Select("/outerelement/innerelement");
Run Code Online (Sandbox Code Playgroud)

我没有得到任何结果:我假设这是因为我没有指定命名空间.如何在我的选择中包含命名空间?

c# xml xpath namespaces xpathnavigator

61
推荐指数
8
解决办法
7万
查看次数

如何将XPath与没有前缀的默认命名空间一起使用?

什么是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语法,但微软并没有打算实现那个......是真的吗?

c# xpath linq-to-xml xml-namespaces

34
推荐指数
3
解决办法
3万
查看次数

XPATHS和默认命名空间

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)

这是一种公平的方法还是有人以不同方式解决了这个问

c# xml xpath namespaces

16
推荐指数
2
解决办法
1万
查看次数

XPath:有没有办法为查询设置默认命名空间?

有没有办法将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)

java xpath

12
推荐指数
1
解决办法
6363
查看次数

如何在C#中选择带有XPath的节点?

简单的问题,我只想从<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)

.net c# xpath

11
推荐指数
2
解决办法
5万
查看次数

带有命名空间的XML文档上的XPath

我有这个带有命名空间的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 xpath namespaces

10
推荐指数
1
解决办法
2万
查看次数

为什么SelectSingleNode返回null?

我正在使用包含类似于此的结构的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?

c# xml xmldocument xml-attribute selectsinglenode

6
推荐指数
1
解决办法
1万
查看次数

C#和XPath - 如何查询

我有一个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文件.

在我看来,我错过了一些非常基本的东西,但不知道是什么.也许这里有人有想法?

先谢谢你,弗兰克

c# xpath

3
推荐指数
1
解决办法
8199
查看次数

使用XPATH使用命名空间选择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给我带来了完全没有问题的节点)

.net c# xml xpath namespaces

1
推荐指数
1
解决办法
8085
查看次数