2008-11-13 103 views
3

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

我的一部分想将节点向下翻到一个元素,但我无法让演员工作。

我试图

MSXML2::IXMLDOMElementPtr pParentElement; 
pParentNode->QueryInterface(__uuidof(MSXML2::IXMLDOMElement), 
          (void**) &pParentElement); 

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

0x0057cc58 _com_error::`scalar deleting destructor'(unsigned int) 

我想是只使用节点的另一条路线:

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失败了,留下我一个NULL指针。你不能调用QueryInterface,你也不能调用get_attributes:P

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

回答

6

我没有看到你写的东西有什么问题。

智能com指针将帮助你转换,如果他们可以,你不必自己写查询接口。

MSXML2::IXMLDOMNodePtr pParentNode = pParameterElement->selectSingleNode("parent"); 
MSXML2::IXMLDOMElementPtr pParentElement(pParentNode); 

在我看来,使用Ptr类型有点痛苦,尽管MSXML接口支持它们。 下面是一个使用ATL

CComPtr<IXMLDOMNode> node = ...; 
CComQIPtr<IXMLDOMElement> elementNode(node); 

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

其他尝试看起来像......

CComPtr<IXMLDOMNamedNodeMap> attributes; 
node->get_attributes(&attributes); 
if(attributes) { 
    _bstr_t name(L"category"); 
    attributes->getNamedItem(name); 
} 

的equivelant例子,它的COM,它总是很难在使用C++ :(

1

您是如何尝试从IXMLDOMNode向IXMLDOMElement降级的?你不能仅仅使用C++类型转换,因为它是一个COM对象:你必须使用QueryInterface()。


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

  • 是pParentNode绝对不为空?我不认为这是问题,因为你得到了什么,但值得检查。
  • QueryInterface()调用并不完全正确,我认为:您必须在返回的接口上以不同方式调用AddRef(),并且您的代码不会。作为另一个海报指出,你可以得到_com_ptr_t <>为你做到这一点:

    MSXML2::IXMLDOMElementPtr pParentElement(pParentNode); 
    

这样做会,我希望,停止这可能是由的AddRef造成的“标量删除析构函数”的错误()/Release()不匹配。

无论如何,请尝试上面的内容,看看pParentElement是否为null。如果是这样,接下来我建议在pParentNode上调用get_nodeType()来查看它实际上是什么类型的节点。这可能会提供一个线索,说明XPath是否不会返回您所期望的。

+0

感谢建议;我看着QueryInterface,但无法使它工作,我已将最新尝试添加到原始问题中;您能看到我正在做的事情有什么不妥? 谢谢 – Symmetric 2008-11-14 01:31:58

+0

您已经指出我如此我的问题; QueryInterface调用是正确的,但是我的pParentNode为null,因为selectSingleNode调用失败。 pParentElement(pParentNode)调用是执行downcast的更好方法。 – Symmetric 2008-11-14 21:51:13

相关问题