我正在用C++构建一个XML文档。我的问题是:我从文档中的一个元素执行XPATH查询,我知道它将返回另一个元素。elementPtr->selectSingleNode调用返回一个IXMLDOMNode。如何访问该节点的属性?
我有点想把Node转换成一个元素,但是我不能让它工作。
我试过了
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调用正在失败,给我留下了一个空指针。你不能对它调用QueryInterface,也不能对它调用get_attributes :P
我选择了适合我问的问题的答案,而不是帮助我意识到我问错了问题的答案。
发布于 2008-11-14 03:58:48
我看不出你写的东西有什么错。
如果可以的话,智能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);
}它是COM,在C++中总是很难使用:(
发布于 2008-11-13 22:06:22
你是如何尝试从IXMLDOMNode到IXMLDOMElement的下传的?您不能只使用C++强制转换,因为它是一个COM对象:您必须使用QueryInterface()。
看看你的QueryInterface()代码,你会有一些想法:
MSXML2::IXMLDOMElementPtr pParentElement(pParentNode);
我希望这样做可以阻止“标量删除析构函数”错误,这种错误可能是由AddRef()/Release()不匹配引起的。
无论如何,尝试上面的方法,看看pParentElement是否为空。如果是,我建议的下一件事是在pParentNode上调用get_nodeType(),看看它到底是哪种类型的节点。这可能会给出一个线索,说明XPath是否没有返回您期望的结果。
发布于 2021-05-20 19:31:46
对于IXMLDOMNamedNodeMap,CComPtr是必需的,否则会出现异常:
不允许抽象类类型为IXMLDOMNamedNodeMap的对象
https://stackoverflow.com/questions/288465
复制相似问题