MSXML loadXML不会加载带有名称空间前缀的元素......为什么?

时间:2011-09-29 14:01:34

标签: c++ c xml visual-studio msxml

HIHO,

我猜,这是一个非常愚蠢的问题,但我最近不得不切换到C / C ++并且多年来都没有这样做。 现在我坚持以下几点:

将XML元素指定为一个简单的字符串:

<myns:factor>1000</myns:factor>

我必须解析字符串,将结果元素添加到同一命名空间中的周围MSXML2 DOM对象。

现在我这样试试:

  HRESULT hr;

  MSXML2::IXMLDOMDocument2Ptr l_xmlFrame;
  MSXML2::IXMLDOMElementPtr l_xmlFrameDoc;

  hr = l_xmlFrame.CreateInstance(__uuidof(MSXML2::DOMDocument));

  if( !FAILED(hr) ) {

    l_xmlFrame->async = VARIANT_FALSE;
    l_xmlFrame->validateOnParse = VARIANT_TRUE;

    // p_strUnit holds the xml as a String
    l_xmlFrame->loadXML(p_strUnit);

  }

loadXML(...)调用失败,但是:

如果我删除名称空间声明,该元素如下所示:

<factor>1000</factor>

通话 完美

我真的不明白,为什么loadXML函数在设置Namespace声明时不会解析字符串。

任何帮助表示赞赏!!!!! :)

谢谢!

1 个答案:

答案 0 :(得分:3)

问题

字符串

<myns:factor>1000</myns:factor>

不是格式良好的XML(关于命名空间)。这就是为什么XML解析器通常不会加载它。

它的格式不正确,因为它使用了尚未声明的名称空间前缀“myns”。

解决方案

如果您将XML更改为类似的内容,则可以解析:

<myns:factor xmlns:myns="mynamespaceURI">1000</myns:factor>

名称空间声明(xmlns:myns="mynamespaceURI")可以在使用名称空间前缀的元素或其任何祖先上进行。

如果您无法更改输入XML,我会询问XML的供应商,“您为什么要给我破碎的XML?”