2016-11-24 41 views
1

スマートポインタを使用して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これは、このようなルックスを作成し、

答えて

1

MSXMLを使用して、名前空間に要素または属性を作成するには、メソッドhttps://msdn.microsoft.com/en-us/library/ms757901(v=vs.85).aspxを使用する必要があります.g。 xDoc->createNode(1, "root", "http://myDefaultNamespaceURL")を使用して、名前空間http://myDefaultNamespaceURLに要素を作成します。同じ名前空間に入れるすべての子孫要素に対して同じものを使用してください。 createNodeを使用して、名前空間に属性を作成することもできます。 createNode->(2, "xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")を追加し、それを要素の属性に追加します。

レベル2でW3C DOMと3は、それらのレベルの前から名前空間が、MSXMLのAPIの日付とXMLの場合に使用することがcreateElementNSsetAttributeNS意識した名前空間を持っており、W3C DOM、認識して、その唯一の名前空間と一致するように更新されませんでしたメソッドはcreateNodeです。メソッドcreateElementsetAttributeは、基本的に名前空間を持たないXMLを作成する場合にのみ便利です。

MSXMLでJScriptを使用するhttp://blogs.msmvps.com/martin-honnen/2009/04/14/creating-xml-with-namespaces-with-javascript-and-msxml/も参照してください。ただし、明らかに適切なAPIの使用に関する問題と解決方法は同じです。

+0

これは素晴らしいですが、どうすれば削除できますか?基本的には、そこにxmlnsタグがあるとクラッシュするサードパーティのアプリケーションがあるので、削除する必要があります。どのようにMSXMLをすべてのタグに挿入するのを止めますか?私は絶対にそこでそれを望んでいない。それを抑える方法はありますか? – Owl

+0

@Owl、新しい質問に必要な詳細を尋ねることを検討してください。 –

関連する問題