XPath Выбор значения узла XML на основе нескольких условий - PullRequest
0 голосов
/ 25 июня 2018

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

<Root>
    <Data>
        <KeyValuePair>
            <Key>Field1</Key>
            <Value>Value1</Value>
        </KeyValuePair>
        <KeyValuePair>
            <Key>Field2</Key>
            <Value>Value2</Value>
        </KeyValuePair>
        <KeyValuePair>
            <Key>Field3</Key>
            <Value>Value3</Value>
        </KeyValuePair>
    </Data>
    <Name>Customer</Name>
    <ID>00000000-0000-0000-0000-000000000000</ID>
</Root>

Я хочу иметь возможность выбрать текст узла Value, где текст узла Key равен «Field2» и имениузел равен "Клиент".Мне также нужно сделать это достаточно гибким, чтобы не заботиться о пространствах имен.

Я смог выбрать узел на основе узла-брата, используя следующее:

//*[local-name()='Value'][../*[local-name()='Key'][./text() = 'Field2']]/text()

Но во время поискадал результаты о том, как выбрать дочерние узлы на основе родительских атрибутов, я не смог найти решение для моей конкретной дилеммы.

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

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

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Попробуйте этот XPath и помните, что XPath чувствителен к регистру :

//Value[../Key='Field2' and ../../../Name='Customer']/text()
0 голосов
/ 25 июня 2018

Этот XPath,

/Root[Name="Customer"]/Data/KeyValuePair[Key="Field2"]/Value/text()

выберет все текстовые узлы Value элементов в KeyValuePair элементах с Key дочерним элементом со строковым значением "Field2", при условии, что KeyValuePairявляется дочерним элементом элемента /Root/Data с дочерним элементом Name, строковое значение которого равно "Customer".

Примечания:

  1. XML и XPathчувствительны к регистру.
  2. Использование local-name() неоправданно неудобно.Возможно, вы видели эту технику в другом месте, пытаясь победить пространства имен, чего не следует делать вообще, и в частности здесь нет необходимости, поскольку в игре нет пространств имен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...