2011-08-09 4 views
0

JS를 사용하여 there is an example in stackoverflow을 알고 있습니다.하지만 C++을 사용하여이 작업을 수행해야하며 이상한 이유로 put_nodeValue()를 사용하여 루트 요소에 네임 스페이스를 추가 할 수 없습니다. "xmlns :"접두사가 붙습니다. 나는 다음과 같은 코드로 노력하고CX를 사용하여 IXMLDOMDocument 루트 요소에 네임 스페이스를 추가하십시오.

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"> 
    <media:group /> 
    <media:group /> 
</entry> 

:

HRESULT hr = S_OK; 
IXMLDOMDocument *doc; 
IXMLDOMNode *entryElement; 
IXMLDOMNode *groupElement; 
IXMLDOMNode *groupElement2; 
IXMLDOMNode *titleElement; 
IXMLDOMNode *mediaAttribute; 

// Initialize ... 
hr = CoInitialize(NULL); 
assert(hr == S_OK); 

// Create (root) document 
hr = CoCreateInstance(
    CLSID_DOMDocument30, 
    NULL, 
    CLSCTX_INPROC_SERVER, 
    IID_IXMLDOMDocument, 
    (void**)&doc); 
assert(hr == S_OK); 

// Define namespaces 
BSTR atomNamespace = L"http://www.w3.org/2005/Atom"; 
BSTR mediaNamespace = L"http://search.yahoo.com/mrss/"; 

// Define types 
VARIANT elementType; 
VariantInit(&elementType); 
V_VT(&elementType) = VT_INT; 
V_INT(&elementType) = NODE_ELEMENT; 

VARIANT attributeType; 
VariantInit(&attributeType); 
V_VT(&attributeType) = VT_INT; 
V_INT(&attributeType) = NODE_ATTRIBUTE; 

// Add "entry" element 
BSTR nodeName = L"entry"; 
hr = doc->createNode(elementType, nodeName, atomNamespace, &entryElement); 
assert(hr == S_OK); 

hr = doc->appendChild(entryElement, NULL); 
assert(hr == S_OK); 

// Add "media" namespace to "entry" element 
nodeName = L"xmlns:media"; 
doc->createNode(attributeType, nodeName, atomNamespace, &mediaAttribute); 

IXMLDOMNamedNodeMap *attributes; 
entryElement->get_attributes(&attributes); 

IXMLDOMNode *newAttribute; 
hr = attributes->setNamedItem(mediaAttribute, &newAttribute); 
assert(hr == S_OK); 

VARIANT nodeValue; 
VariantInit(&nodeValue); 
V_VT(&nodeValue) = VT_BSTR; 
V_BSTR(&nodeValue) = mediaNamespace; 
hr = newAttribute->put_nodeValue(nodeValue); 
assert(hr == S_OK); 

// Add "group" element 
nodeName = L"media:group"; 
hr = doc->createNode(elementType, nodeName, mediaNamespace, &groupElement); 
assert(hr == S_OK); 

hr = entryElement->appendChild(groupElement, NULL); 
assert(hr == S_OK); 

// Add second "group" element 
nodeName = L"media:group"; 
hr = doc->createNode(elementType, nodeName, mediaNamespace, &groupElement2); 
assert(hr == S_OK); 

hr = entryElement->appendChild(groupElement2, NULL); 
assert(hr == S_OK); 

어떤 생각

그래서,이 같은 뭔가가 필요? MSXML6을 사용하고 있습니다.

답변

0

알았습니다. 나는 약간의 도움을 받았다 :

// Create (root) document 
hr = CoCreateInstance(
    CLSID_DOMDocument30, 
    NULL, 
    CLSCTX_INPROC_SERVER, 
    IID_IXMLDOMDocument, 
    (void**)&doc); 
assert(hr == S_OK); 

// Define namespaces 
BSTR atomNamespace = L"http://www.w3.org/2005/Atom"; 
BSTR mediaNamespace = L"http://search.yahoo.com/mrss/"; 

CComVariant elementType = NODE_ELEMENT; 
CComVariant attributeType = NODE_ATTRIBUTE; 

// Add "entry" element 
hr = doc->createNode(elementType, CComBSTR(L"entry"), atomNamespace, &entryNode); 
assert(hr == S_OK); 

hr = doc->appendChild(entryNode, NULL); 
assert(hr == S_OK); 

// Create "xmlns:media" attribute 
CComPtr<IXMLDOMElement> element; 
CComPtr<IXMLDOMAttribute> attr; 

doc->createNode(attributeType, CComBSTR(L"xmlns:media"), mediaNamespace, &attrNode); 
assert(hr == S_OK); 

hr = attrNode->put_nodeValue(CComVariant(mediaNamespace)); 
assert(hr == S_OK); 

entryNode->QueryInterface(&element); 
assert(hr == S_OK); 

attrNode->QueryInterface(&attr); 
assert(hr == S_OK); 

element->setAttributeNode(attr, NULL); 

// Add first "group" element 
hr = doc->createNode(elementType, CComBSTR(L"media:group"), mediaNamespace, &groupNode1); 
assert(hr == S_OK); 

hr = entryNode->appendChild(groupNode1, NULL); 
assert(hr == S_OK); 

// Add second "group" element 
hr = doc->createNode(elementType, CComBSTR(L"media:group"), mediaNamespace, &groupNode2); 
assert(hr == S_OK); 

hr = entryNode->appendChild(groupNode2, NULL); 
assert(hr == S_OK); 

나는 그것을 속성으로 추가하고 올바른 인터페이스를 쿼리해야했다.

관련 문제