Как я могу извлечь значение атрибута узла через XPath?
Пример XML-файла:
<parents name='Parents'>
<Parent id='1' name='Parent_1'>
<Children name='Children'>
<child name='Child_2' id='2'>child2_Parent_1</child>
<child name='Child_4' id='4'>child4_Parent_1</child>
<child name='Child_1' id='3'>child1_Parent_1</child>
<child name='Child_3' id='1'>child3_Parent_1</child>
</Children>
</Parent>
<Parent id='2' name='Parent_2'>
<Children name='Children'>
<child name='Child_1' id='8'>child1_parent2</child>
<child name='Child_2' id='7'>child2_parent2</child>
<child name='Child_4' id='6'>child4_parent2</child>
<child name='Child_3' id='5'>child3_parent2</child>
</Children>
</Parent>
</parents>
Пока у меня есть строка XPath:
//Parent[@id='1']/Children/child[@name]
Возвращается только child
элементы, но я хотел бы иметь значение name
атрибута.
Для моего образца XML-файла вот что я хотел бы получить:
Child_2
Child_4
Child_1
Child_3
Ответы:
Ваш оригинал
child[@name]
означает элемент,child
который имеет атрибутname
. Вы хотитеchild/@name
.источник
Чтобы получить только значение (без имен атрибутов), используйте
string()
:string(//Parent[@id='1']/Children/child/@name)
Функция fn: string () вернет значение своего аргумента как
xs:string
. Если его аргумент является атрибутом, он будет возвращать значение атрибута какxs:string
.источник
xqilla
этим нужно было позвонитьxs:string
. Интересно, почему.xs
это префикс пространства имен для функций XPath. Поэтому они не перепутаны с другими.Вы должны использовать
//Parent[@id='1']/Children/child/data(@name)
Атрибуты не могут быть сериализованы, поэтому вы не можете вернуть их в виде XML. Что вам нужно сделать, это получить данные из атрибута с помощью функции data ().
источник
Как ответили выше:
будет выводить только
name
атрибут 4child
узлов, принадлежащихParent
указанному его предикату[@id=1]
. Затем вам нужно будет изменить предикат на,[@id=2]
чтобы получить наборchild
узлов для следующегоParent
.Однако, если вы полностью игнорируете
Parent
узел и используете:Вы можете выбрать
name
атрибут всехchild
узлов за один раз.источник
Это тот случай, когда элемент имеет 2 атрибута, и мы можем получить один атрибут с помощью другого.
источник
@ryenus, тебе нужно перебрать результат. Вот как я это сделаю в VBScript;
источник
для всех xml с пространством имен используйте local-name ()
источник