XmlDocument.Save не выводит полные имена QName для элементов

StackOverflow https://stackoverflow.com/questions/1159771

  •  18-09-2019
  •  | 
  •  

Вопрос

Я столкнулся с проблемой, из-за которой, когда я программно создаю XML-документ с использованием классов System.Xml, а затем использую метод Save, выходной XML не использует QNames для узлов, а просто использует локальные имена.

например Желаемый результат

<ex:root>
  <ex:something attr:name="value">
</ex:root>

Но то, что я сейчас получаю, это

<root>
  <something name="value">
</root>

Это несколько упрощено, поскольку все пространства имен, которые я использую, полностью определяются с использованием атрибутов xmlns в элементе документа, но здесь я пропустил это для ясности.

Я знаю, что класс XmlWriter можно использовать для сохранения XmlDocument и что для этого требуется класс XmlWriterSettings, но я не мог понять, как настроить это так, чтобы получать полный вывод QNames.

Это было полезно?

Решение

Как вы говорите, корневому элементу необходимо определение пространства имен:

<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
    <iis:WebSite Id="asdf" />
</Wix>

Код приведенного выше XML:

XmlDocument document = new XmlDocument();
document.AppendChild(document.CreateXmlDeclaration("1.0", null, null));
XmlNode rootNode = document.CreateElement("Wix", "http://schemas.microsoft.com/wix/2006/wi");
XmlAttribute attr = document.CreateAttribute("xmlns:iis", "http://www.w3.org/2000/xmlns/");
attr.Value = "http://schemas.microsoft.com/wix/IIsExtension";
rootNode.Attributes.Append(attr);
rootNode.AppendChild(document.CreateElement("iis:WebSite", "http://schemas.microsoft.com/wix/IIsExtension"));
document.AppendChild(rootNode);

Требование передать uri пространства имен в качестве аргумента методам CreateAttribute и CreateElement кажется нелогичным, поскольку можно утверждать, что документ способен получить эту информацию, но эй, вот как это работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top