スマートポインタを使用してxmlドキュメントを作成するために、インポートしたMSXML(#import "msxml6.dll")でVisual Studio C++を使用しています。MSXML C++既定の名前空間を宣言する
名前空間を作成するためにsetProperty()関数を使用し、次に対応する属性をドキュメント要素に追加します。ただし、デフォルトの名前空間を宣言しようとすると、ドキュメント要素の下のすべての要素に属性xmlns=""
が追加されます。 。ここで
が私のコードです:私はちょうど<exampleElement/>
代わりの<exampleElement xmlns=""/>
<root xmlns="http://myDefaultNamespaceURL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemaLocationValue">
<exampleElement xmlns=""/>
</root>
:
// 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これは、このようなルックスを作成し、
これは素晴らしいですが、どうすれば削除できますか?基本的には、そこにxmlnsタグがあるとクラッシュするサードパーティのアプリケーションがあるので、削除する必要があります。どのようにMSXMLをすべてのタグに挿入するのを止めますか?私は絶対にそこでそれを望んでいない。それを抑える方法はありますか? – Owl
@Owl、新しい質問に必要な詳細を尋ねることを検討してください。 –