Как искать узел, используя Linq to XML Query?

2

Ниже документа xml

    <Root>
        <Global>
        </Global>
        <local>
            <section name="A">
                <subsection name="A">
                    <innersection name="A">
                        <Property1>
                        </Property1>
                    </innersection>
                    <innersection name="B">
                        <Property1>
                        </Property1>
                    </innersection>
                </subsection>
                <subsection name="B">
                    <innersection name="A">
                        <Property1>
                        </Property1>
                    </innersection>
                    <innersection name="B">
                        <Property1>
                        </Property1>
                    </innersection>
                </subsection>
            </section>
            <section name="B">
                <subsection name="A">
                    <innersection name="A">
                        <Property1>
                        </Property1>
                    </innersection>
                    <innersection name="B">
                        <Property1>
                        </Property1>
                    </innersection>
                </subsection>
                <subsection name="B">
                    <innersection name="A">
                        <Property1>
                        </Property1>
                    </innersection>
                    <innersection name="B">
                        <Property1>
                        </Property1>
                    </innersection>
                </subsection>
            </section>
        </local>
    </Root>

Теперь я хочу свойство property1, раздел name= "B" и подраздел name= "B" и innersection name= "B" в одном запросе с использованием linq для xml.

Теги:
linq-to-xml

3 ответа

5
Лучший ответ

Вот мой вариант, альтернативный Jon's, предполагая, что Property1 встречается только один раз внутри innersection, и вам нужно только одно:

var Property1 = doc.Root.Elements("local").Elements("section")
    .Where(x => x.Attribute("name") == "B").Elements("subsection")
    .Where(x => x.Attribute("name") == "B").Elements("innersection")
    .Where(x => x.Attribute("name") == "B").Element("Property1");
4

EDIT: Удален LINQ to XML "обычный" стиль запроса, поскольку ssg лучше. Однако я хотел оставить версию XPath. Он не тестировался, но я думаю, что он должен работать...

var properties = doc.XPathSelectElements(
 "//section[@name='B']/subsection[@name='B']/innersection[@name='B']/property1");
  • 0
    Разве этот обход не завершит DOM вместо того, чтобы начинать с фильтрации разделов под локальным?
  • 0
    Да, это так. Я сильно подозреваю, что для большинства случаев из реальной жизни это будет работать в мгновение ока :)
Показать ещё 3 комментария
1

Поскольку этот вопрос также был отмечен как vb.net, вот эквивалент ssg-запроса в vb.net:

Dim Property1 = doc.<local>.<section>.Where(Function(x) x.@name = "B") _
                           .<subsection>.Where(Function(x) x.@name = "B") _
                           .<innersection>.Where(Function(x) x.@name = "B") _
                           .<Property1>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню