我正在使用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=""/>
答案 0 :(得分:1)
使用MSXML,要在命名空间中创建元素或属性,您需要使用xDoc->createNode(1, "root", "http://myDefaultNamespaceURL")
方法https://msdn.microsoft.com/en-us/library/ms757901(v=vs.85).aspx。 http://myDefaultNamespaceURL
在名称空间createNode
中创建一个元素。确保对要放在同一名称空间中的所有后代元素使用相同的内容。您还可以使用createNode->(2, "xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")
在命名空间中创建属性,例如createElementNS
然后将其添加到元素的属性中。
级别2和级别3中的W3C DOM具有名称空间感知setAttributeNS
和createNode
,用于具有名称空间的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有关的问题和解决方案是相同的。