C++ msxmlc++;声明默认名称空间

C++ msxmlc++;声明默认名称空间,c++,xml,visual-c++,xml-namespaces,msxml,C++,Xml,Visual C++,Xml Namespaces,Msxml,我使用VisualStudioC++用MSXML导入(“导入”MSXML6.DLL),使用智能指针创建XML文档。 我使用setProperty()函数创建名称空间,然后向document元素添加相应的属性,但当我尝试声明默认名称空间时,document元素下面的所有元素都添加了属性xmlns=“” 这是我的密码: // Macro to check HRESULT #define CheckHr(myHr) do{ hr = myHr; if(FAILED(hr)) throw _com_er

我使用VisualStudioC++用MSXML导入(“导入”MSXML6.DLL),使用智能指针创建XML文档。

我使用setProperty()函数创建名称空间,然后向document元素添加相应的属性,但当我尝试声明默认名称空间时,document元素下面的所有元素都添加了属性
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>


我还没能找到一种方法,用MSXML代替
,在名称空间中创建元素或属性,您需要使用
createNode
方法,例如
xDoc->createNode(1,“根“,”http://myDefaultNamespaceURL")
在命名空间中创建元素
http://myDefaultNamespaceURL
。确保对要放在同一命名空间中的所有子元素使用相同的名称。您还可以使用
createNode
在命名空间中创建属性,例如
createNode->(2,“xsi:schemaLocation”http://www.w3.org/2001/XMLSchema-instance”
,然后将其添加到元素的属性中

级别2和级别3中的W3C DOM具有名称空间感知的
CreateElements
setAttributeNS
可用于具有名称空间的XML,但MSXML API可追溯到这些级别之前,从未更新以匹配W3C DOM,其唯一的名称空间感知方法是
createNode
。方法
createElement
setAttribute
基本上只对创建没有名称空间的XML有用


另请参见哪个将JScript与MSXML一起使用,但显然与正确使用API相关的问题和解决方案是相同的。

这很好,但如何删除它。基本上,我有一个第三方应用程序,当其中有xmlns标记时会崩溃,所以需要删除它。如何阻止MSXML将其插入每个标记中。我只是绝对不希望它出现在那里。“有没有办法压制它?”猫头鹰,考虑问一个新的问题和必要的细节。