【问题标题】:Why can't I use xpath to parse nodes in the default namespace?为什么我不能使用 xpath 来解析默认命名空间中的节点?
【发布时间】:2012-01-11 10:54:36
【问题描述】:

我是一个 XML 新手,我有一个 XML 文档(我无法编辑它,因为它来自其他地方)但它有一个像这样的根节点:

<Configuration xmlns="http://schemas.mycomp.com/product/settings" version="2.0.0">

我正在尝试使用 msxml 和 xpath 解析此文档,如果我删除了 xmlns 属性,我已经成功完成了。出于某种原因,有了这个 xmlns 属性,文档将无法解析。我尝试设置 msxml 解析以使用以下方式识别文档:

m_pXMLDoc->setProperty( _bstr_t(L"AllowDocumentFunction"), _variant_t(true));   
m_pXMLDoc->setProperty( _bstr_t(L"AllowXsltScript"), _variant_t(true));
m_pXMLDoc->setProperty( _bstr_t(L"SelectionLanguage"), _variant_t(L"XPath"));   
m_pXMLDoc->setProperty( _bstr_t(L"SelectionNamespaces"), _variant_t(L"xmlns='http://schemas.mycomp.com/product/settings'"));

m_pXMLDoc->preserveWhiteSpace = VARIANT_FALSE;
m_pXMLDoc->resolveExternals = VARIANT_TRUE; 
m_pXMLDoc->validateOnParse = VARIANT_FALSE;

通过阅读,看起来 xpath 仅适用于“无名”命名空间,并且本文档设置了默认命名空间,因此它不再是“无名”。我可以使用 MSXML 设置 xpath 使用的命名空间吗?

【问题讨论】:

  • 嗯,我注意到如果我编辑 XML 文件并将 xmlns 属性更改为 xmlns:x="schemas.mycomp.com/product/settings" 那么文档解析就好了。我想这与默认命名空间中的元素有关,这导致了我的问题......
  • 在这种情况下,不要忘记在 XPath 表达式中包含 x:。 /x:Element 仍将匹配 schemas.mycomp.com/product/settings">,而 /Element 将匹配两个东西:具有默认命名空间的 和没有命名空间的

标签: c++ xml msxml


【解决方案1】:

来自 Microsoft:这种行为是设计使然 ...

http://support.microsoft.com/kb/288147

在指定 SelectionNamespaces 属性时使用命名空间前缀

【讨论】:

  • 是的,我担心是这种情况。遗憾的是,如果您需要解析别人的 XML,这不是一个很好的答案:-(
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-03-11
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多