首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从IXMLDOMNode访问元素属性?

如何从IXMLDOMNode访问元素属性?
EN

Stack Overflow用户
提问于 2008-11-13 21:49:20
回答 3查看 17.4K关注 0票数 3

我正在用C++构建一个XML文档。我的问题是:我从文档中的一个元素执行XPATH查询,我知道它将返回另一个元素。elementPtr->selectSingleNode调用返回一个IXMLDOMNode。如何访问该节点的属性?

我有点想把Node转换成一个元素,但是我不能让它工作。

我试过了

代码语言:javascript
复制
MSXML2::IXMLDOMElementPtr pParentElement;
pParentNode->QueryInterface(__uuidof(MSXML2::IXMLDOMElement), 
                            (void**) &pParentElement);

这将导致以下运行时错误:

代码语言:javascript
复制
0x0057cc58 _com_error::`scalar deleting destructor'(unsigned int)

我尝试的另一种方法是只使用节点:

代码语言:javascript
复制
MSXML2::IXMLDOMNodePtr pParentNode = 
    pParameterElement->selectSingleNode("parent");
MSXML2::IXMLDOMNamedNodeMap* pParentAttributes;
pParentNode->get_attributes(&pParentAttributes);

MSXML2::IXMLDOMNodePtr pCategoryNameNode = 
    pParentAttributes->getNamedItem("Category");
VARIANT value;
pCategoryNameNode->get_nodeValue(&value);
CString categoryName = value;

这在"parentNode->get_attributes()“失败。

看起来我遗漏了一些东西;API应该不会这么难用。

-编辑--

我遗漏的是selectSingleNode调用正在失败,给我留下了一个空指针。你不能对它调用QueryInterface,也不能对它调用get_attributes :P

我选择了适合我问的问题的答案,而不是帮助我意识到我问错了问题的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-14 03:58:48

我看不出你写的东西有什么错。

如果可以的话,智能com指针将帮助您进行转换,您不必自己编写查询接口。

代码语言:javascript
复制
MSXML2::IXMLDOMNodePtr pParentNode = pParameterElement->selectSingleNode("parent");
MSXML2::IXMLDOMElementPtr pParentElement( pParentNode );

在我看来,使用Ptr类型有点麻烦,尽管MSXML接口更喜欢它们。下面是一个使用ATL的等效示例

代码语言:javascript
复制
CComPtr<IXMLDOMNode> node = ...;
CComQIPtr<IXMLDOMElement> elementNode( node );

if( elementNode ) { 
// it was an element!
} else { 
// it's something else try again? 
}

另一次尝试看起来像..。

代码语言:javascript
复制
CComPtr<IXMLDOMNamedNodeMap> attributes;
node->get_attributes( &attributes );
if( attributes ) {
  _bstr_t name( L"category" );
  attributes->getNamedItem(name);
}

它是COM,在C++中总是很难使用:(

票数 6
EN

Stack Overflow用户

发布于 2008-11-13 22:06:22

你是如何尝试从IXMLDOMNode到IXMLDOMElement的下传的?您不能只使用C++强制转换,因为它是一个COM对象:您必须使用QueryInterface()。

看看你的QueryInterface()代码,你会有一些想法:

  • Is pParentNode确定不为空吗?考虑到你得到了什么,我不认为这是问题所在,但它值得检查。
  • QueryInterface()调用是不太正确的,我认为:你必须以某种方式在返回的接口上调用AddRef(),而你的代码不会。正如另一个帖子所指出的,你可以让_com_ptr_t<>为你做这件事:

MSXML2::IXMLDOMElementPtr pParentElement(pParentNode);

我希望这样做可以阻止“标量删除析构函数”错误,这种错误可能是由AddRef()/Release()不匹配引起的。

无论如何,尝试上面的方法,看看pParentElement是否为空。如果是,我建议的下一件事是在pParentNode上调用get_nodeType(),看看它到底是哪种类型的节点。这可能会给出一个线索,说明XPath是否没有返回您期望的结果。

票数 1
EN

Stack Overflow用户

发布于 2021-05-20 19:31:46

对于IXMLDOMNamedNodeMapCComPtr是必需的,否则会出现异常:

不允许抽象类类型为IXMLDOMNamedNodeMap的对象

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/288465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档