Как удалить повторяющиеся атрибуты из XML с помощью C #

Я анализирую некоторые XML-файлы от стороннего поставщика, и, к сожалению, это не всегда правильно сформированный XML, поскольку иногда некоторые элементы содержат повторяющиеся атрибуты.

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

Очевидно, что загрузка содержимого в объект XMLDocument вызывает исключение XmlException на повторяющиеся атрибуты, так что я мог бы использовать XmlReader для обхода элемента XML за элементом и работы с повторяющимися атрибутами, когда я перехожу к нарушающему элементу.

Однако XmlException вызывается на reader.Read () - до того, как я получу возможность проверить атрибуты элемента.

Вот пример метода для демонстрации проблемы:

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

Есть ли другой способ проанализировать ввод и удалить повторяющиеся атрибуты без использования регулярных выражений и манипуляций со строками?

6
задан Catch22 13 July 2011 в 09:12
поделиться