2008-11-13 347 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