[C#][XPath]Attribuut van een element ophalen.

Pagina: 1
Acties:

  • Tsjilp
  • Registratie: November 2002
  • Niet online
Hallo,
Ik ben bezig om een webservice in C# te bouwen. Deze krijgt de volgende xmlstring binnen:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<rule xmlns="http://www.test.nl">
    <rulename>news</rulename>
    <title>Nieuwsberichten</title>
    <configuration>
        <config id="0" type="text" name="Titel"></config>
        <config id="1" type="select" display="radio" name="Weergave" required="true" validateonchange="true">
            <option value="headlines" checked="true">Headlines</option>
            <option value="titles">Titel</option>
            <option value="full">Volledig</option>
            <option value="categories">Categorieën</option>
        </config>
    </configuration>
</rule>

en deze laad ik als volgt in:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string retval = "";
        ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
        document = new XPathDocument(ms);
        nav = document.CreateNavigator();

        manager = new XmlNamespaceManager(nav.NameTable);
        manager.AddNamespace("pr", "http://www.test.nl");

        XPathNodeIterator nodes = nav.Select("/pr:rule/pr:configuration/pr:config[@pr:name='Weergave']/pr:option[@pr:checked='true']", manager);
        //nodes.MoveNext();
        XPathNavigator nodesNavigator = nodes.Current;
        XPathNodeIterator nodesText = nodesNavigator.SelectDescendants(XPathNodeType.Attribute , false);

        while (nodesText.MoveNext())
        {
            retval += nodes.Current.Name + ": " + nodes.Current.Value + " | ";
        }

Nu wil ik het attribuut value ophalen van het element option met attribuut checked = true in het element config met als attribuut name = weergave.

Ik heb nu zo'n beetje alle mogelijke XPath varianten er op losgelaten, ik krijg gewoon geen resultaat (ook geen error).

Ik denk dat C# loopt te miepen over deze [@pr:name='Weergave'] dingen.

[ Voor 15% gewijzigd door Tsjilp op 12-07-2006 10:28 . Reden: oeps! foute xml gepost, checked staat er nu wel in ]

Raar... Is zo gek nog niet


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 13:40
Heb overlaatst nog zoiets gepost
Xml properties uitlezen in C#

Maar op het eerste zicht lijkt alles ok. Heb je ook al eens zonder de "pr:" geprobeerd?
Welk effect namespaces in XPath hebben is mij ook niet helemaal duidelijk, maar ik denk dat die namespace overbodig is.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 22-12-2025

PhysicsRules

Dux: Linux voor Eenden

Ik ben nog niet helemaal hierin thuis, maar wat doet [@pr:checked='true']. Ik zie die niet in de XML terugkomen.

  • Tsjilp
  • Registratie: November 2002
  • Niet online
Heb hem iets anders, bleek dat 'Weergave' nog wat meer karakters had (name="id0x027bcb68_Weergave"):
C#:
1
2
3
4
5
6
7
8
ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
        document = new XPathDocument(ms);
        nav = document.CreateNavigator();
        XPathNodeIterator nodes = nav.Select("/rule/configuration/config[contains(@name,'Weergave')]/option[@checked='true']/@value");
        while (nodes.MoveNext())
        {
            retval += "nodes.current.name= " + nodes.Current.Name + "; nodes.current.value= " + nodes.Current.Value + "|| ";
        }

Ook heb ik de namespace verwijderd, helaas zonder resultaat.

als ik hem door http://www.activsoftware.com/xml/xpath/ haal, dan geeft ie gewoon netjes resultaat.

Raar... Is zo gek nog niet


  • Tsjilp
  • Registratie: November 2002
  • Niet online
Door ook de namespace te verwijderen (xmlns=...) en nog wat in de code te rommelen werkt het nu ineens wel
C#:
1
2
3
4
5
6
ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
        document = new XPathDocument(ms);
        nav = document.CreateNavigator();
        ///Select the checked option
        XPathNodeIterator nodes = nav.Select("/rule/configuration/config[contains(@name,'Weergave')]/option[@checked='true']/@value");
        nodes.MoveNext();
leest nu deze
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<rule>
    <rulename>news</rulename>
    <title>Nieuwsberichten</title>
    <p_id>144</p_id>
    <configuration>
        <config type="text" name="Titel"><![CDATA[]]></config>
        <config type="select" display="radio" name="id0x027bcb68_Weergave" validateonchange="true" required="true">
            <option value="headlines" ><![CDATA[Headlines]]></option>
            <option value="titles" checked="true"><![CDATA[Titel]]></option>
            <option value="full" ><![CDATA[Volledig]]></option>
            <option value="categories" ><![CDATA[Categorieën]]></option>
        </config>
        <config type="text" name="Aantal" required="true"><![CDATA[05]]></config>
        <config type="select" display="checkbox" name="id0x0231eb60_Onderwerpen" >
            <option value="1" checked="true"><![CDATA[ICT]]></option>
            <option value="2" ><![CDATA[Algemeen]]></option>
            <option value="3" ><![CDATA[Sport]]></option>
            <option value="4" checked="true"><![CDATA[Economisch]]></option>
            <option value="5" ><![CDATA[Wetenschap]]></option>
            <option value="6" ><![CDATA[Weer]]></option>
            <option value="7" ><![CDATA[Verkeer]]></option>
            <option value="8" ><![CDATA[Beurs]]></option>
            <option value="9" ><![CDATA[DVD Film]]></option>
            <option value="10" ><![CDATA[Games]]></option>
        </config>
    </configuration>
</rule>
perfect uit.

Tnx!

Wel vreemd dat er overal wordt geroepen dat je een namespace moet aangeven, terwijl dat dus blijkbaar niet nodig is!

Raar... Is zo gek nog niet