Estoy analizando algunos archivos XML de un proveedor de terceros y, lamentablemente, no siempre está bien formado XML, ya que a veces algunos elementos contienen atributos duplicados.Cómo eliminar atributos duplicados de XML con C#
No tengo control sobre la fuente y no sé qué elementos pueden tener atributos duplicados ni conozco los nombres de los atributos duplicados de antemano.
Obviamente, la carga del contenido en un objeto XMLDocument
plantea una XmlException en el duplicado atributos así que aunque podría utilizar un XmlReader
al paso de que el elemento XML a elemento y hacer frente a los atributos de duplicado cuando llegue al elemento infractor.
Sin embargo, el XmlException
se genera en reader.Read()
- antes de que tenga la oportunidad de insertar los atributos del elemento.
Aquí está un método de ejemplo para demostrar el problema:
public static void ParseTest()
{
const string xmlString =
@"<?xml version='1.0'?>
<!-- This is a sample XML document -->
<Items dupattr=""10"" id=""20"" dupattr=""33"">
<Item>test with a child element <more/> stuff</Item>
</Items>";
var output = new StringBuilder();
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
XmlWriterSettings ws = new XmlWriterSettings();
ws.Indent = true;
using (XmlWriter writer = XmlWriter.Create(output, ws))
{
while (reader.Read()) /* Exception throw here when Items element encountered */
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);
if (reader.HasAttributes){ /* CopyNonDuplicateAttributes(); */}
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
}
}
string str = output.ToString();
}
¿Hay otra manera de analizar la entrada y quitar los atributos de duplicado sin tener que usar expresiones regulares y la manipulación de cadenas?
Solo puede ser posible si el proveedor de la API del procesador XML tiene ganchos que le permiten enganchar en el procesamiento y manejar las condiciones de error – Ankur
¡Problema interesante, esperamos ver la solución! –
No habrá solución a este problema utilizando XML, porque su entrada no es XML. Usted dice que no tiene control sobre la entrada, pero ¿al menos puede hacer que sus superiores sepan que su proveedor no le envía XML? ¿Al menos puedes asegurarte de que tu _vendor_ lo sepa?Cualquier organización lo suficientemente estúpida como para enviar estos datos podría ser lo suficientemente estúpida como para no darse cuenta de que no es XML. –