c# поиск парсинг - Как получить значение XElement, а не значение всех дочерних узлов?




3 Answers

При поиске текстовых данных в элементе <parent> вы должны искать дочерние узлы, у которых есть свойства NodeType равные XmlNodeType.Text . Эти узлы будут иметь тип XText . Следующий пример иллюстрирует это:

var p = XElement
    .Parse("<parent>Hello<child>test1</child>World<child>test2</child>!</parent>");

var textNodes = from c in p.Nodes()
                where c.NodeType == XmlNodeType.Text
                select (XText)c;

foreach (var t in textNodes)
{
    Console.WriteLine(t.Value);
}

Обновление: если все, что вам нужно, это первый текстовый узел, если таковой имеется, вот пример, использующий вызовы метода LINQ вместо синтаксиса понимания запроса:

var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault();
if (firstTextNode != null)
{
    var textValue = firstTextNode.Value;
    ...do something interesting with the value
}

Примечание. Использование First() или FirstOrDefault() будет более эффективным, чем Count() > 0 в этом сценарии. Count всегда перечисляет всю коллекцию, а FirstOrDefault() будет перечисляться только до тех пор, пока не будет найдено совпадение.

чтение атрибуту

Пример xml:

<parent>
<child>test1</child>
<child>test2</child>
</parent>

Если я ищу parent.Value, где родитель XElement, я получаю «test1test2». То, что я ожидаю, - это ». (поскольку нет текста / значения для.

Какую собственность XElement мне следует искать?




Удивительно, что кодер где-то в Microsoft думал, что возвращение всех текстовых значений в виде конкатенированной и неподписанной строки было бы полезно. К счастью, другой разработчик MS написал расширение XElement, чтобы вернуть то, что они называют «Мелкое значение» текстового узла. Для тех, кто заставляет кисти щелкнуть по ссылкам, функция ниже ...

    public static string ShallowValue(this XElement element)
    {
        return element
               .Nodes()
               .OfType<XText>()
               .Aggregate(new StringBuilder(),
                          (s, c) => s.Append(c),
                          s => s.ToString());
    }

И вы называете это так, потому что он также дает вам все пробелы (или, подумайте об этом, вы можете обрезать его в расширении, что угодно)

// element is a var in your code of type XElement ...
string myTextContent = element.ShallowValue().Trim();



// Create the XElement
XElement parent = XElement.Parse(
    @"<parent>Hello<child>test1</child>World<child>test2</child>!</parent>");

// Make a copy
XElement temp=new XElement(parent);

// remove all elements but root
temp.RemoveNodes();

// now, do something with temp.value, e.g.
Console.WriteLine(temp.value);



Related


Tags

c#   xelement