Parsuję niektóre pliki XML od zewnętrznego dostawcy i niestety nie zawsze jest to dobrze sformatowany kod XML, ponieważ czasami niektóre elementy zawierają zduplikowane atrybuty.Jak usunąć zduplikowane atrybuty z kodu XML za pomocą C#
Nie mam kontroli nad źródłem i nie wiem, które elementy mogą mieć zduplikowane atrybuty, ani nie znam z góry zduplikowanych nazw atrybutów.
Oczywiście ładowanie zawartości do obiektu XMLDocument
podnosi XmlException w dwóch egzemplarzach atrybuty więc chociaż mógłbym użyć XmlReader
do kroku chociaż elementu XML przez elementu i radzić sobie z duplikat atrybuty kiedy się do elementu naruszającego.
Jednak XmlException
został podniesiony na reader.Read()
- zanim otrzymam szansę na odszukanie atrybutów elementu.
Oto przykładowy sposób, aby wykazać problem:
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();
}
Czy istnieje inny sposób na analizę danych wejściowych i usunąć duplikaty atrybutów bez konieczności używania wyrażeń regularnych i łańcuchach?
Może być to możliwe tylko wtedy, gdy dostawca procesora XML procesora posiada jakiekolwiek haki, które pozwalają na przechwycenie i przetworzenie błędów. – Ankur
Interesujący problem, czekamy na rozwiązanie! –
Nie będzie rozwiązania tego problemu za pomocą XML, ponieważ twoje dane wejściowe nie są danymi XML. Mówisz, że nie masz kontroli nad danymi wejściowymi, ale czy możesz przynajmniej poinformować przełożonych, że twój dostawca nie wysyła Ci XML? Czy możesz przynajmniej upewnić się, że twój _vendor_ wie o tym?Każda organizacja na tyle głupia, aby wysłać te dane, może być na tyle głupia, by nie zdawać sobie sprawy, że to nie XML. –