Pregunta Cómo verificar el nombre del elemento con WriteEndElement


Estoy escribiendo xml con XmlWriter. Mi código tiene muchas secciones como esta:

xml.WriteStartElement("payload");
ThirdPartyLibrary.Serialise(results, xml);
xml.WriteEndElement(); // </payload>

El problema es que ThirdPartyLibrary.Serialise método no es confiable. Puede suceder (dependiendo de la variable) results) que no cierra todas las etiquetas que abre. Como consecuencia, mi línea WriteEndElement está pervertida, se consume cerrando las etiquetas colgantes de la biblioteca, en lugar de escribir </payload>.

Por lo tanto, me gustaría hacer una llamada marcada a WriteEndElement que comprueba el nombre del elemento y arroja una excepción a menos que el cursor esté en el elemento esperado.

xml.WriteEndElement("payload");

Puedes pensar en esto como XmlReader.ReadStartElement(name) que arroja a menos que el cursor esté en el lugar esperado en el documento.

¿Cómo puedo conseguir esto?


Editar: Un segundo caso de uso para este método de extensión sería hacer mi propio código más legible y confiable.


7
2018-04-04 13:53


origen


Respuestas:


XMLWriter solo escribe la información xml dada en la transmisión sin ninguna validación. Si realiza alguna validación al escribir las etiquetas xml, surgirá un problema de rendimiento al crear el archivo xml grande.

Crear el archivo XML usando XMLWriter depende del riesgo del desarrollador. Si desea hacer tal tipo de validación, puede usar XMLDocument.

Si realmente desea hacer esta validación en XMLWriter, debe crear el escritor utilizando String o StringBuilder. Porque, si usa Stream o TextWriter, no puede leer la información que está escrita en la secuencia en el medio de la escritura. En Cada actualización del XML, debe leer la cadena y escribir su propio método para validar la información escrita.

Te sugiero que uses XMLDocument para crear este tipo de xml.


1
2018-05-31 07:01



Al final, escribí un método de extensión WriteSubtree eso le da a esta API utilizable:

using (var resultsXml = xml.WriteSubtree("Results"))
{
    ThirdPartyLibrary.Serialise(results, resultsXml);
}

El método de extensión XmlWriter.WriteSubtree es análogo a .NET XmlReader.ReadSubtree. Devuelve un XmlWriter especial que comprueba contra negocios divertidos. Su método de eliminación cierra las etiquetas que quedan abiertas.


0
2018-05-31 10:23