gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:20:12 25 4
gpt4 key购买 nike

我使用导入了 MSXML 的 Visual Studio C++ (#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 具有命名空间感知 createElementNSsetAttributeNS用于带有命名空间的 XML,但 MSXML API 的日期早于这些级别并且从未更新以匹配 W3C DOM,其唯一的命名空间感知方法是 createNode .方法createElementsetAttribute基本上只对创建没有命名空间的 XML 有用。

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

关于c++ - MSXML C++ 声明默认命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40790355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com