MSXML C++ 声明默认命名空间
MSXML C++ Declare default namespace
我正在使用 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=""/>
使用 MSXML,要在名称空间中创建元素或属性,您需要使用 createNode
方法 https://msdn.microsoft.com/en-us/library/ms757901(v=vs.85).aspx,例如xDoc->createNode(1, "root", "http://myDefaultNamespaceURL")
在命名空间 http://myDefaultNamespaceURL
中创建一个元素。确保对要放入同一命名空间的所有后代元素使用相同的元素。您还可以使用 createNode
在命名空间中创建属性,例如createNode->(2, "xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")
然后将其添加到元素的属性中。
2 级和 3 级的 W3C DOM 具有命名空间感知 createElementNS
和 setAttributeNS
用于 XML 与命名空间的情况,但 MSXML API 日期早于这些级别并且从未更新以匹配 W3C DOM,它唯一的命名空间感知方法是 createNode
。 createElement
和 setAttribute
方法基本上只对创建没有命名空间的 XML 有用。
另请参阅 http://blogs.msmvps.com/martin-honnen/2009/04/14/creating-xml-with-namespaces-with-javascript-and-msxml/,它将 JScript 与 MSXML 结合使用,但显然与正确 API 使用相关的问题和解决方案是相同的。
我正在使用 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=""/>
使用 MSXML,要在名称空间中创建元素或属性,您需要使用 createNode
方法 https://msdn.microsoft.com/en-us/library/ms757901(v=vs.85).aspx,例如xDoc->createNode(1, "root", "http://myDefaultNamespaceURL")
在命名空间 http://myDefaultNamespaceURL
中创建一个元素。确保对要放入同一命名空间的所有后代元素使用相同的元素。您还可以使用 createNode
在命名空间中创建属性,例如createNode->(2, "xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")
然后将其添加到元素的属性中。
2 级和 3 级的 W3C DOM 具有命名空间感知 createElementNS
和 setAttributeNS
用于 XML 与命名空间的情况,但 MSXML API 日期早于这些级别并且从未更新以匹配 W3C DOM,它唯一的命名空间感知方法是 createNode
。 createElement
和 setAttribute
方法基本上只对创建没有命名空间的 XML 有用。
另请参阅 http://blogs.msmvps.com/martin-honnen/2009/04/14/creating-xml-with-namespaces-with-javascript-and-msxml/,它将 JScript 与 MSXML 结合使用,但显然与正确 API 使用相关的问题和解决方案是相同的。