[xpath] получение строкового значения узла

koly

Можно ли как-нибудь получить строковое значение узла в xpath ?
Например:
<node>
string representation
</node>
я хочу, чтобы выполнение волшебного запроса xpath вернуло "string representation"

6yrop

//node/text

Helga87

Можно также string(/Lala)

koly

в этом случае выдается #text, а я хочу сам текст, а не текстовую ноду

koly

это вообще не работает

Helga87

У меня работает.
Как ты это используешь?

Dasar

оба приведенных запроса должны работать.
ps
покажи как ты выполняешь запросы.

Helga87

высказал предположение, что ты делаешь не string(/node а string(/Lala). У меня в посте написано не то название вершины =)

koly

Вот код, выполняющий запрос:
 
 using System;
using System.Xml;
using System.Xml.Schema;
public class XPathApp {
    protected static int messageCount = 0;
    public static void Main(string[] args) {
     if(args.Length < 1) {
  Console.Out.WriteLine("xml file name is not specified");
return;
}
try {
XmlTextReader tr = new XmlTextReader(args[0]);
     XmlValidatingReader vr = new XmlValidatingReader(tr);
     XmlDocument xmldoc = new XmlDocument;
     xmldoc.Load(vr);
     Console.Out.Write("Query string:");
     string query = Console.In.ReadLine;
     XmlNodeList list = xmldoc.SelectNodes(query);
     foreach(XmlNode node in list)
     Console.WriteLine("{0}",node.Name);
}
catch(Exception exc) {
Console.Out.WriteLine("Exception: " + exc.Message);
}
    }
}
 

Документ:
 
<?xml version="1.0" encoding="utf-8" ?>
<AdressBook >
<Rec>
<fio>
<SurName>Belov</SurName>
<Name>Vasily</Name>
<FatherName>A</FatherName>
</fio>
<adress>
Moscow, Russia
</adress>
<phone>1456</phone>
<email>
aha.ru
</email>
</Rec>
<Rec>
<fio>
<SurName>Belov</SurName>
<Name>Vasily</Name>
<FatherName>A</FatherName>
</fio>
<adress>
Cwoprty
</adress>
<phone>77777</phone>
<email>
fsdfdsf
</email>
</Rec>
</AdressBook>
  

Запускаю программу, код которой дан выше, с параметром xml документа.
Ввожу:
 
//*/text

получаю:
 
#text
#text
#text
#text
#text
#text
#text
#text
#text
#text
#text
#text  

Ввожу:
 
string(//*)  

Получаю:
 
 Exception: Expression must evaluate to a node-set. 

 
высказал предположение, что ты делаешь не string(/node а string(/Lala). У меня в посте написано не то название вершины =)
Я почитал спецификацию xpath и немного в нем ориентируюсь

koly

всё, туплю. Это программа такая, что выводит имя узла, а не его значение...

bobby

логично, что второй запрос не работает

Helga87

 
    class Program
    {
     static void Main(string[] args)
     {
     XmlDocument doc = new XmlDocument;
     doc.Load(@"c:\krasin\trash\lala.xml");
     XPathNavigator nav = doc.CreateNavigator;
     Console.WriteLine(nav.Evaluate("string(/Lala)";
     }
    }

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

FRider

чювак, ты через XmlDocument работаешь с ДОМ-моделью.
Тут же все написано:
Exception: Expression must evaluate to a node-set.
Можно указывать только те xpath выражения, которые возвращают node-set.
Указанное выше выражение возвращает строку, в соответствие со спецификацией xpath.

Dasar

> всё, туплю. Это программа такая, что выводит имя узла, а не его значение...
т.е. ты понял, что надо было смотреть InnerText, а не Name?

koly

Программа не моя - я не обратил внимание на то, что именно выводится в консоль
Оставить комментарий
Имя или ник:
Комментарий: