MSXML C ++声明默认命名空间

时间:2016-11-24 15:46:37

标签: c++ xml visual-c++ xml-namespaces msxml

我正在使用Visual Studio C ++导入MSXML(#import“msxml6.dll”)来使用智能指针创建xml文档。

我使用setProperty()函数创建名称空间,然后我将相应的属性添加到文档元素,但是当我尝试声明默认名称空间时,文档元素下面的所有元素都具有属性xmlns=""添加到他们。

这是我的代码:

// Macro to check HRESULT
#define CheckHr(myHr) do{ hr = myHr; if(FAILED(hr)) throw _com_error(hr); }while(0)

void makeMyXml()
{
HRESULT hr{ S_OK };
MSXML2::IXMLDOMDocument3Ptr xDoc{ NULL };

try
{
    // Create document
    CheckHr(xDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60)));

    // Add namespaces
    CheckHr(xDoc->setProperty(L"SelectionNamespaces", _T("xmlns=\"http://myDefaultNamespaceURL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")));

    // Add document element
    CheckHr(xDoc->appendChild(xDoc->createElement(_T("root"))));

    // Add namespace attributes to root
    CheckHr(xDoc->GetdocumentElement()->setAttribute(_T("xmlns"), _T("http://myDefaultNamespaceURL")));
    CheckHr(xDoc->GetdocumentElement()->setAttribute(_T("xmlns:xsi"), _T("http://www.w3.org/2001/XMLSchema-instance")));
    CheckHr(xDoc->GetdocumentElement()->setAttribute(_T("xsi:schemaLocation"), _T("http://schemaLocationValue")));

    CheckHr(xDoc->GetdocumentElement()->appendChild(xDoc->createElement(_T("exampleElement"))));

    CheckHr(xDoc->save("test.xml"));

}
catch (_com_error &e)
{
    // handle any thrown com errors here
}

return;
}

这个创建的xml如下所示:

<root xmlns="http://myDefaultNamespaceURL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemaLocationValue">
    <exampleElement xmlns=""/>
</root>

我找不到让<exampleElement/>代替<exampleElement xmlns=""/>

的方法

1 个答案:

答案 0 :(得分:1)

使用MSXML,要在命名空间中创建元素或属性,您需要使用xDoc->createNode(1, "root", "http://myDefaultNamespaceURL")方法https://msdn.microsoft.com/en-us/library/ms757901(v=vs.85).aspxhttp://myDefaultNamespaceURL在名称空间createNode中创建一个元素。确保对要放在同一名称空间中的所有后代元素使用相同的内容。您还可以使用createNode->(2, "xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")在命名空间中创建属性,例如createElementNS然后将其添加到元素的属性中。

级别2和级别3中的W3C DOM具有名称空间感知setAttributeNScreateNode,用于具有名称空间的XML,但MSXML API的日期早于这些级别,并且从未更新以匹配W3C DOM,它唯一的名称空间感知方法是createElement。方法setAttribute和{{1}}基本上只对创建没有名称空间的XML有用。

另请参阅使用JScript和MSXML的http://blogs.msmvps.com/martin-honnen/2009/04/14/creating-xml-with-namespaces-with-javascript-and-msxml/,但显然与正确使用API​​有关的问题和解决方案是相同的。