ulungss Ответов: 2

Xml parser get value


У меня есть пример XML, как это :

<?xml version="1.0"?>
<methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <string>PLNPASC</string>
                        </value>
                        <value>
                            <string>20160907222141</string>
                        </value>
                        <value>
                            <string>538731734541</string>
                        </value>
                        <value>
                            <string></string>
                        </value>
                        <value>
                            <string></string>
                        </value>
                        <value>
                            <string>887849</string>
                        </value>
                        <value>
                            <string>12000</string>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodResponse>




и я хочу получить значение с нулевым значением в массиве данных без xml dataReader

Надеюсь, вы поможете

Что я уже пробовал:

Я пробую какой-то метод, но безрезультатно....

xszaboj

В чем причина не использовать XML dataReader? Можете ли вы использовать XDocument?

ulungss

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

Maciej Los

Что вы имеете в виду "я хочу получить значение с нулевым значением в массиве данных"?

Bernhard Hiller

Кто создал такую мерзость XML? Все свойства просто определяются как value/string, в то время как они, по-видимому, имеют некоторое значение; например, второе значение, по-видимому, является DateTime. Я думаю, что порядок пунктов имеет значение...

2 Ответов

Рейтинг:
2

Maciej Los

Пожалуйста, прочтите мой комментарий к этому вопросу...

Если вы хотите получить данные с этого пути: methodResponse->params->param->value->array->data->value->string, вы можете использовать Linq To Xml[^] с этим запросом:

var result = xdoc.Descendants("string").Where(m =(string)m.Value==string.Empty);

Выше запрос возвращает:
<string></string>
<string></string>


var result = xdoc.Descendants("string").Where(m =(string)m.Value!=string.Empty);

Результат:
<string>PLNPASC</string>
<string>20160907222141</string>
<string>538731734541</string>
<string>887849</string>
<string>12000</string>


Рейтинг:
1

David_Wimbley

Не знаю, почему вы не хотите использовать xml data reader, поэтому я использую XDocument и linq to xml.

Этот код покажет все значения XML-элементов, где Вещь является нулевой или пустой.

var myxml = @"<?xml version='1.0'?>
<methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <string>PLNPASC</string>
                        </value>
                        <value>
                            <string>20160907222141</string>
                        </value>
                        <value>
                            <string>538731734541</string>
                        </value>
                        <value>
                            <string></string>
                        </value>
                        <value>
                            <string></string>
                        </value>
                        <value>
                            <string>887849</string>
                        </value>
                        <value>
                            <string>12000</string>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodResponse>";

            XDocument xdoc = XDocument.Parse(myxml);


            var elements = xdoc.Descendants(XName.Get("value"));

            foreach (XElement el in elements.Where(m => string.IsNullOrEmpty(m.Value)))
            {
                Console.WriteLine("el.Name: " + el.Name);
                Console.WriteLine("el.Value" + el.Value);
            }


Maciej Los

Вы проверили свое решение? Что произойдет, если вы используете Where(m =>!string.IsNullOrEmpty(m.Value))?

David_Wimbley

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

el.Name: значение
Эл.Значение
el.Name: значение
Эл.Значение

Возможно, я неправильно понял, о чем спрашивает OP, поэтому, если вы хотите, чтобы все значения не были нулевыми, удалите восклицательный знак (примечание для OP).