Как мне ссылаться на «следующий» (пока еще не существующий) узел XML в последовательности? - PullRequest
0 голосов
/ 27 марта 2009

Так что расширить ...

У меня есть XML

<root>
    <list>
        <item value="9"/>
        <item value="3"/>
        <item value="1"/>
        <item value="8"/>
        <item value="4"/>
    </list>
</root>

У меня есть XPath "/ root / list / item [4]", который, я полагаю, извлечет 5-й элемент 'item' (атрибут value которого равен 4)

Это говорит о том, что XPath "/ root / list / item [5]" будет ссылаться на (пока еще не существующий) 6-й элемент.

То, что я хотел бы, - это выражение XPath, которое будет ссылаться на элемент 'Next' (пока еще не существующий) 'item' независимо от того, сколько элементов существует в настоящее время ...

Я предполагаю, что это передаст выражение (которое будет считать количество текущих элементов), а не жестко закодированное число.

Я знаю, как я это сделаю, но просто не могу найти, как мне это сделать ... разочарование.

Обновление : Чтобы уточнить ... Я хотел бы вернуть "узел элемента после последнего узла элемента". атрибуты были там только для того, чтобы отличить существующие узлы). Я ценю, что это вернет пустой набор узлов.

Обновление : Ну, у меня есть свой ответ, поэтому я думаю, это будет честно, я объясняю, почему я хотел этого:)

По сути, xPath используется некоторым кодом .Net в качестве адреса записи, а не адреса чтения.

Я передаю xPath несуществующего местоположения в подпрограмму EnsureNodeExists. (Примечание: я не могу изменить эту процедуру EnsureNodeExists) Код будет перебирать каждый элемент xPath, создавая его, если его там нет, и затем устанавливая его в качестве родителя для следующей итерации.

Таким образом, я могу вызвать этот код с помощью "/ root / list / item [position () = last ()] / follow-sibling :: item [1]" 3 раза, и это приведет к созданию 3 узлов элементов.

Ответы [ 4 ]

5 голосов
/ 27 марта 2009

Во-первых, ваш XPath:

/root/list/item[4]

извлекает четвертый элемент (поскольку предикат [4] является сокращением для [position() = 4]).

Чтобы получить элемент с @value 4, используйте:

/root/list/item[@value = '4']

Если вы хотите получить элемент после элемента с помощью @value 4, используйте:

/root/list/item[@value = '4']/following-sibling::item[1]

Это переводится на английский как "идущий от /root/list/item с @value = '4', посмотрите на следующих братьев и сестер с именем 'item' и возьмите первый".

Это работает, даже если нет следующего пункта. В этом случае выбранный набор узлов будет пустым.

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

/root/list/item[@value = '4'][1]/following-sibling::item[1]

Чтобы обратиться к последнему узлу в списке, используйте:

/root/list/item[position() = last()]

Хорошее изображение, объясняющее оси XPath , можно найти здесь: http://nwalsh.com/docs/tutorials/xsl/xsl/graphics/axes.gif (часть большего учебника ).

3 голосов
/ 27 марта 2009

Если вы просто хотите, чтобы выражение возвращало пустой набор узлов, я думаю, что обычно нужно сделать что-то вроде /parent::node(), которое будет пустым, поскольку у корня нет родителей.

Полагаю, вы могли бы сделать что-то вроде /root/list/item[position() = (last() + 1)], но это дало бы вам тот же результат, что и все, что не возвращало узлов. Так что я не совсем уверен, чего вы на самом деле пытаетесь достичь.

1 голос
/ 27 марта 2009

попробуйте следующее братское выражение

справку по этому вопросу можно найти здесь

0 голосов
/ 04 декабря 2010

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

...