2012-02-27 13 views
10

Próbuję utworzyć zapytanie/ciąg XPath, który pobiera określony element z dokumentu XML. Próbuję pobrać element o identyfikatorze = 38, ale mój kod zawsze nie zwraca nic z jakiegoś powodu.Ciąg XPath przechwytujący element o określonej wartości identyfikatora

Jeśli spojrzysz na mój kod & organizacji mojego pliku XML, możesz mi powiedzieć, co XPath potrzebuję, aby pobrać element z identyfikatorem = 38?

Mój kod to:

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(getProductURL()); 
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')"); 

// node always is null for some reason? 

Sposób xml jest zorganizowana jest tak:

<courseg> 
    <group isempty="False" isbranch="true" id="1" name="abc"> 
     <group isempty="False" isbranch="true" id="38" name="def"></group> 
    </group> 
</courseg> 

Odpowiedz

19

XPath musisz się

//*[@id='38'] 

Oto przykład z XDocument:

 XDocument xdoc = XDocument.Parse(@" 
<courseg> 
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc""> 
     <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group> 
    </group> 
</courseg>"); 
     XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']"); 
     Console.WriteLine(node); 
3

Użyj tej kwerendy XPath:

//*[@id = 38] 

Wybiera każdy węzeł z atrybutem id równa 38. Jeśli masz być bardziej szczegółowe, czyli wybrać group z atrybutem id równa 38, użyj tego:

//group[@id = 38] 
-1

Kiedy wspomina

xdoc.DocumentElement.SelectSingleNode("id('38')" 

prosicie XmlDocument aby wyszukać węzła potomnego wewnątrz węzeł główny, którego nazwa to "id". Ale najlepiej "id" jest atrybutem, a nie xmlnode.

Więc trzeba użyć //group[@id = '38'] uzyskać wszystkie węzeł dziecko posiadające nazwę „grupa” i atrybut „id” o wartości 38

+0

Nieprawidłowy. Nie jest to funkcja id(). –

5

Funkcja id („P38”) by wybrać element z wartością ID z P38. Ale to nie znaczy tylko "atrybut o nazwie" id "". Oznacza to atrybut zadeklarowany w DTD lub schemacie jako identyfikator typu. Nie pokazałeś DTD ani schematu, a podejrzewam, że go nie masz. Jeśli tak, a jeśli zadeklarowałeś atrybut id jako identyfikator typu, to dokument byłby nieprawidłowy, ponieważ wartość identyfikatora nie może być całkowicie numeryczna (ze względu na starsze powody SGML musi mieć postać nazwy).

W praktyce najlepiej jest unikać funkcji id(), chyba że masz poważne wymagania dotyczące wydajności. Jest zbyt delikatny - działa tylko wtedy, gdy sprawdzasz poprawność dokumentu źródłowego względem schematu lub DTD. W XSLT użyj zamiast tego klawisza(). Alternatywnie, wiele procesorów rozpoznaje teraz nazwę atrybutu xml: id jako "deklarującą własność" wartość identyfikatora bez odniesienia do schematu lub DTD: użyj go, jeśli twój procesor to obsługuje.

Powiązane problemy