Получение текста во вложенном элементе в XML с помощью C# - PullRequest
1 голос
/ 05 марта 2020
<row>
    <id>9578</id>
    <processes>
        <process ID="PROCESS A">
            <subprocess ID ="STEP A">
                <val>abcde</val>
            </subprocess>
        </process>
        <process ID="PROCESS B">
            <subprocess ID ="STEP B">
                <val>fghij</val>
            </subprocess>
        </process>
        <process ID="PROCESS C">
            <subprocess ID ="STEP C">
                <val>klmno</val>
            </subprocess>
        </process>
    </processes>
<row>

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

XmlNodeReader nodereader = new XmlNodeReader(Xdoc);
nodereader.MoveToContent();
var xdoc = XDocument.Load(nodereader); 
var doc_list = xdoc.Descendants("row").Select(x => new
{
    id = x.Element("id").Value,
    ProcessA = x.Element("processes").Elements("process").Single(attr => attr.Attribute("ID").Value == "PROCESS A").Value 
}).ToList();

ProcessA будет содержать значения элемента val (в данном случае abcde). Но я продолжаю получать NullReferenceException. Я думаю, что я почти на правильном пути, но мне все еще нужна небольшая помощь.

РЕДАКТИРОВАТЬ Спасибо всем за вашу помощь, но я понимаю, что мой код работает. Проблема была просто орфографическая ошибка из-за идентификатора. Вместо

id = x.Element("id").Value,

я случайно сделал

id = x.Element("Id").Value,

, что привело к NullReferenceException для LINQ. Мой код для получения элемента val сработал. Мораль истории: иногда ошибка может быть не там, где вы думаете.

1 Ответ

4 голосов
/ 05 марта 2020

Это то, что вы хотите сделать?

var doc = XDocument.Parse(@"<row>
        <id>9578</id>
        <processes>
            <process ID=""PROCESS A"">
                <subprocess ID =""STEP A"">
                    <val>abcde</val>
                </subprocess>
            </process>
            <process ID=""PROCESS B"">
                <subprocess ID =""STEP B"">
                    <val>fghij</val>
                </subprocess>
            </process>
            <process ID=""PROCESS C"">
                <subprocess ID =""STEP C"">
                    <val>klmno</val>
                </subprocess>
            </process>
        </processes>
    </row>");

var doc_list = doc
.Elements("row")
.Elements("processes")
.Elements("process")
.Elements("subprocess")
.Select(x => new{
        Id = x.Attribute("ID").Value,
        ProcessVal = x.Element("val").Value
    })

Альтернатива с использованием XPath вместо:

var doc_list = doc
.XPathSelectElements(@"/row/processes/process/subprocess")
.Select(x => new{
    Id = x.Attribute("ID").Value,
    ProcessVal = x.Element("val").Value
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...