C# Чтение подэлементов с XMLReader(?)

В настоящее время я борюсь с чтением подэлементов из подэлементов. Что было бы лучшим способом прочитать структурированный XML:

<network>
<channel type="...">
        <sub1.1>...</sub1.1>
        <sub1.2>...</sub1.2>
        ...
</channel>

<channel type="...">
        <sub1.1>...</sub1.1>
        <sub1.2>...</sub1.2>
        ...
</channel>
...

<group number="...">
        <sub2.1>...</sub2.1>
        <sub2.2>...</sub2.2>
        ...
</group>
...

<group number="...">
        <sub2.1>...</sub2.1>
        <sub2.2>...</sub2.2>
        ...
</group>
...

<gateway id="...">
        <sub3.1>...</sub3.1>
        <sub3.2>...</sub3.2>
        <sub3.3>
                <sub3.3.1>...</sub3.3.1>
        </sub3.3>
        <sub3.4>
                <sub3.4.1>...</sub3.4.1>
        </sub3.4>
...
</gateway>
...
<network>

Я хотел бы прочитать атрибуты, такие как тип, число, идентификатор... а также все подэлементы и суб-субэлементы. Я пробовал это с XMLReader, но изо всех сил пытался получить элементы sub-sub и т.д...

Если бы кто-то мог помочь мне с подходом, я был бы очень благодарен.

1 ответ

Решение

Ты можешь использовать MoveToFirstElementAttribute() а также MoveToNextAttribute() получить имя атрибута (и его значения)

string fileName = @"C:\file.xml";

using (XmlTextReader reader = new XmlTextReader(fileName)) //using System.Xml
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Whitespace || reader.NodeType == XmlNodeType.EndElement) continue;
                Console.WriteLine("\n------------------------------------------------------------------------------");

                string message = $"Position: {reader.LineNumber},{reader.LinePosition}\tNode Type: {reader.NodeType.ToString()}\tDepth: {reader.Depth}\n";
                if (reader.Name.Trim() != "") message += $"Name: {reader.Name}\t";
                if (reader.Value.Trim() != "") message += $"Value: {reader.Value}\t";
                Console.WriteLine(message);

                // Read() method doesn't get into attribute nodes, so check them manually then get them by MoveToFirstElementAttribute() and MoveToNextAttribute() methods
                if (reader.HasAttributes)
                {
                    Console.WriteLine($"\nHas {reader.AttributeCount} Attribute(s):\n");
                    reader.MoveToFirstAttribute();

                    Console.WriteLine($"Attribute Name: {reader.Name}\tValue: {reader.Value}");
                    while (reader.MoveToNextAttribute())
                    {
                        Console.WriteLine($"Attribute Name: {reader.Name}\tValue: {reader.Value}");
                    }
                    reader.MoveToElement();
                }
            }
        }

Я использовал XmlTextReader (который является дочерним классом XmlReader), потому что он включает в себя информацию строки. если вы хотите использовать XmlReader, вы можете заменить его на XmlTextReader (за исключением того, что XmlReader не имеет свойств LineNumber и LinePosition)

Вы также можете проверить "подсознание" элемента с помощью Depth имущество. Имейте в виду, что Depth начинается с 0 (значение глубины внешних элементов будет 0)

Другие вопросы по тегам