Как я могу получить первый элемент после элемента с LINQ-to-XML? - PullRequest
7 голосов
/ 03 августа 2009

С помощью этого кода я могу получить заголовок из следующего XML-файла:

var xml = XElement.Load (@"C:\\test\\smartForm-customersMain.xml");
string title = xml.Element("title").Value;

Но как мне сделать это более точно, например, "получить первый элемент после элемента smartForm , например, что-то вроде этого:

//PSEUDO-CODE:
string title = xml.Element("smartForm").FirstChild("title");

XML:

<?xml version="1.0" encoding="utf-8" ?>
<smartForm idCode="customersMain">
    <title>Customers Main222</title>
    <description>Generic customer form.</description>
    <area idCode="generalData" title="General Data">
        <column>
            <group>
                <field idCode="anrede">
                    <label>Anrede</label>
                </field>
                <field idCode="firstName">
                    <label>First Name</label>
                </field>
                <field idCode="lastName">
                    <label>Last Name</label>
                </field>
            </group>
        </column>
    </area>
    <area idCode="address" title="Address">
        <column>
            <group>
                <field idCode="street">
                    <label>Street</label>
                </field>
                <field idCode="location">
                    <label>Location</label>
                </field>
                <field idCode="zipCode">
                    <label>Zip Code</label>
                </field>
            </group>
        </column>
    </area>
</smartForm>

Ответы [ 3 ]

5 голосов
/ 03 августа 2009

Немного добавить к ответу Эндрю, если вы не знаете, является ли smartForm корневым элементом, но по-прежнему хотите текст заголовка первой такой записи, которую вы используете:

xml.DescendantsAndSelf("smartForm").Descendants("title").First().Value;

Для этого требуется , чтобы в нем был элемент smartForm с элементом заголовка.

Если вы хотите, чтобы элемент title был непосредственным потомком в smartForm, вы можете использовать:

xml.DescendantsAndSelf("smartForm").Elements("title").First().Value;

Если вас не волнует, как называется title, и вы просто хотите первый субэлемент, вы должны использовать:

xml.DescendantsAndSelf("smartForm").Elements().First().Value;
3 голосов
/ 03 августа 2009

Вы хотите использовать метод оси Descendants, а затем вызвать метод расширения FirstOrDefault, чтобы получить первый элемент.

Вот простой пример:

using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        String xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
            <smartForm idCode=""customersMain"">
                <title>Customers Main222</title>
                <description>Generic customer form.</description>
                <area idCode=""generalData"" title=""General Data"">
                <column>
                    <group>
                    <field idCode=""anrede"">
                        <label>Anrede</label>
                    </field>
                    <field idCode=""firstName"">
                        <label>First Name</label>
                    </field>
                    <field idCode=""lastName"">
                        <label>Last Name</label>
                    </field>
                    </group>
                </column>
                </area>
                <area idCode=""address"" title=""Address"">
                <column>
                    <group>
                    <field idCode=""street"">
                        <label>Street</label>
                    </field>
                    <field idCode=""location"">
                        <label>Location</label>
                    </field>
                    <field idCode=""zipCode"">
                        <label>Zip Code</label>
                    </field>
                    </group>
                </column>
                </area>
            </smartForm>";

        XElement element = XElement.Parse(xml)
            .Descendants()
            .FirstOrDefault();
    }
}
0 голосов
/ 12 августа 2016

Моей задачей было найти первого ребенка с указанным именем. Если xml использует пространства имен, то вместо

e.Elements(name).FirstOrDefault()

запись

e.Elements().FirstOrDefault(i => i.Name.LocalName == name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...