Pregunta

He encontrado un problema con lo que cuando se crea un documento XML mediante programación utilizando las clases de System.XML y luego usar el método Guardar la salida XML no utiliza QNames para los nodos y simplemente utiliza los nombres locales.

por ejemplo, salida deseada

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

Pero lo que se ve es actualmente

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

Esto se simplifica un poco desde todos los espacios de nombres que estoy usando se están completamente definido mediante los atributos xmlns en el elemento documento, sino que he omitido para mayor claridad aquí.

Soy consciente de que la clase XmlWriter se puede utilizar para guardar un XmlDocument y que esto toma una clase XmlWriterSettings pero no pude ver cómo configurar esto de tal manera que llegue salida QNames completo.

¿Fue útil?

Solución

Como usted dice, el elemento raíz necesita la definición de espacio de nombres:

<?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>

El código para el xml arriba:

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);

El requisito de aprobar el URI de espacio de nombres como un argumento a los métodos createAttribute y CreateElement parece contrario a la intuición, porque se podría argumentar que el documento es capaz de derivar esa información, pero bueno, eso es como funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top