Я знаю , есть пример в stackoverflow с использованием JS, но мне нужно выполнить это с помощью C ++, и по странной причине я не могу добавить пространство имен к корневому элементу, используя put_nodeValue (), еслиимя атрибута имеет префикс «xmlns:».
Итак, мне нужно что-то вроде этого:
<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.