XMLNODE: как я могу выбрать этот узел с атрибутом в моем xml

У меня есть xml со следующей структурой

<student>
    <name fname="oliver">
    </name>
    <name fname="de">
    </name>
    <name fname="johnson">
    </name>
</student>

мой код такой:

//после загрузки в xmldocument с именем xmlrecord

    XmlNode row = xmlRecord.SelectSingleNode("/student");
    student.fname = row.SelectSingleNode("name[fname]");

Но ничего не возвращает. Пожалуйста, как лучше всего выбрать узел fname='johnson'?


person oliverdejohnson    schedule 24.03.2014    source источник
comment
Это довольно странная структура для XML; наличие каждой части имени в качестве отдельного атрибута на трех отдельных узлах name кажется излишним. Части имени являются атрибутами одного имени. Если бы у вас был контроль над этим XML, я бы изменил его на <student><name fname="..." mname="..." lname="..." /></student>   -  person Cᴏʀʏ    schedule 24.03.2014
comment
нет, у меня нет контроля над xml   -  person oliverdejohnson    schedule 24.03.2014


Ответы (1)


Вам нужен атрибут fname первого элемента <name>, поэтому вы должны написать:

student.fname = row.SelectSingleNode("name/@fname");
person Frédéric Hamidi    schedule 24.03.2014
comment
это не сработало ... это дало ошибку XPATH: выражение должно оцениваться как набор узлов. - person oliverdejohnson; 24.03.2014
comment
Он должен возвращать набор узлов, состоящий из одного элемента: узла атрибута. Ошибка, о которой вы говорите, может возникнуть, если в выражении XPath есть синтаксическая ошибка, может быть, вы включили мой ответ в более крупное выражение? - person Frédéric Hamidi; 24.03.2014
comment
@oliverdejohnson, выражение все еще должно работать с вашей отредактированной разметкой, оно будет соответствовать трем узлам атрибутов, но SelectSingleNode() вернет только первый. Я подозреваю, что вы не рассказываете нам всю историю, и что могут быть задействованы пространства имен. Можете ли вы обновить свой вопрос с вашей точной разметкой XML? - person Frédéric Hamidi; 24.03.2014
comment
дело в том, что в моем xml этот узел не является первым узлом... он где-то в середине примерно 60 таких узлов - person oliverdejohnson; 24.03.2014
comment
@oliverdejohnson, тогда вам придется использовать другой атрибут в качестве определителя. Если у вас нет индекса элемента, который вы ищете, в этом случае вы можете сопоставить его в соответствии с его position(). - person Frédéric Hamidi; 24.03.2014
comment
как мне использовать position(), пожалуйста? - person oliverdejohnson; 24.03.2014
comment
@oliverdejohnson, например: SelectSingleNode("name[position() = 42]/@fname"). Обратите внимание, что значения position() отсчитываются от единицы. - person Frédéric Hamidi; 24.03.2014
comment
спасибо @frederic, я наконец-то заработал, выполнив SelectSingleNode("name[fname=johnson]"... в основном просто предоставив атрибут value.tnks за то, что помог мне прийти к этому осознанию. ура - person oliverdejohnson; 24.03.2014