2016-11-24 4 views
1

Я использую Visual Studio C++ с импортированным MSXML (#import "msxml6.dll") для создания XML-документов с помощью интеллектуальных указателей.MSXML C++ Объявить пространство имен по умолчанию

Я использую функцию 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=""/>

ответ

1

С помощью MSXML для создания элементов или атрибутов в пространстве имен вам необходимо использовать метод createNodehttps://msdn.microsoft.com/en-us/library/ms757901(v=vs.85).aspx, где вы используете e .г. xDoc->createNode(1, "root", "http://myDefaultNamespaceURL"), чтобы создать элемент в пространстве имен http://myDefaultNamespaceURL. Убедитесь, что вы используете то же самое для всех элементов-потомков, которые хотите разместить в одном и том же пространстве имен. Вы также можете использовать createNode для создания атрибутов в пространстве имен, например. createNode->(2, "xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance"), а затем добавьте это к атрибутам элемента.

В W3C DOM уровня 2 и 3 имеет пространство имен осведомленный createElementNS и setAttributeNS, которые будут использоваться в случае XML с пространствами имен, но в API даты MSXML от до этих уровней и никогда не был обновлен, чтобы соответствовать 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, одинаковы.

+0

Это здорово, но как его удалить. В основном у меня есть стороннее приложение, которое падает, когда там есть xmlns-тэг, поэтому он НЕОБХОДИМО удалить. Как остановить MSXML, вставляя его в каждый тег. Я просто не хочу этого. Есть ли способ подавить его? – Owl

+0

@ Owl, подумайте о том, чтобы задать новый вопрос с необходимыми деталями. –

Смежные вопросы