Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C# 1.1+xml] Probleem met ophalen attributes lijst uit node*

Pagina: 1
Acties:
  • 192 views sinds 30-01-2008
  • Reageer

  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
Ik heb al een hele zwik voorbeelden gevonden maar deze gaan altijd uit van het feit dat de naam(namen) van attributes bekend zijn. In dat geval is het inderdaad niet moeilijk om een value van een attribute op te halen. Probleem is echter als je niet weet welke attributes er zijn.

XML:
1
2
3
4
5
<node>
   <subNode1 attrib="bla">waarde 1</subNode1>
   <subNode1 attrib="bla2" type="abc">waarde 2</subNode1>
   <subNode1 attrib="bla2" type="xyz" attrib2="uvw">waarde 3</subNode1>
</node>


Vervolgens laat ik onderstaande code er op los:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
XPathNodeIterator iterator = nav.Select("/node/subNode");

while (iterator.MoveNext())
{
   if (iterator.Current.HasAttributes)
      {
         XPathNodeIterator xni = iterator.Current.SelectChildren(XPathNodeType.Attribute);
         int i = xni.Count;

         // hier moet een nieuwe while komen die door de attributen loopt
      }
}


HasAttributes geeft true maar wanneer ik dan door de attributes wil lopen zijn die er niet (getuigd i).
Uit de watch krijg ik ook geen nuttige informatie. Uiteindelijk moet ik natuurlijk waarde1, waarde2 of waarde3 eruit krijgen maar dat is afhankelijk door combinatie van attributes en hun waardes

Ik heb ook al iets zitten proberen met MoveToNextAttribute() maar snap niet hoe ik dan verder moet. euh

https://k1600gt.nl


  • Razr
  • Registratie: September 2005
  • Niet online
Ik weet niet wat voor een reader je gebruikt hoe het bij de XPathNodeIterator zit maar bij een XmlReader kun je met de Value propertie de huidige node uitlezen.

Zal zoiets zijn
C#:
1
2
3
while(iterator.MoveToNextAttribute()) {
  string waarde = iterator.Value;
}

[ Voor 83% gewijzigd door Razr op 21-12-2007 12:09 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
In je XML bestand heten de nodes "subNode1" en in je select gebruik je "subNode".

Verder staat je vraag volgens mij precies hier ?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
XPathDocument document = new XPathDocument("C:\\test.xml");
XPathNavigator nav = document.CreateNavigator();

XPathNodeIterator nodes = nav.Select("/node/subNode1"); 
while (nodes.MoveNext())
{
    XPathNavigator attnav = nodes.Current.Clone();
    attnav.MoveToFirstAttribute();
    Console.WriteLine("{0} = {1}", attnav.Name, attnav.Value);

    while (attnav.MoveToNextAttribute())
    {
        Console.WriteLine("{0} = {1}", attnav.Name, attnav.Value);
    }
    Console.WriteLine();
}

[ Voor 67% gewijzigd door RobIII op 21-12-2007 12:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

afaik zijn attributen geen children van elementen bij xpath en moet je ze benaderen via de attribute axis.

The one who says it cannot be done, should never interrupt the one who is doing it.


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
RobIII schreef op vrijdag 21 december 2007 @ 12:14:
In je XML bestand heten de nodes "subNode1" en in je select gebruik je "subNode".
Das een tik fout - de echte xml ziet er anders uit. Ik heb die pagina van msdn gemist maar dat komt waarschijnlijk omdat ik in google op verkeerde keywords heb laten zoeken..

Ik ga het testen...

https://k1600gt.nl


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11 13:15

Korben

() => {};

cspare schreef op vrijdag 21 december 2007 @ 12:32:
afaik zijn attributen geen children van elementen bij xpath en moet je ze benaderen via de attribute axis.
Onjuist, attributen kun je gewoon benaderen:
XSLT:
1
node/subNode1/@attrib

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

Korben schreef op vrijdag 21 december 2007 @ 13:26:
[...]

Onjuist, attributen kun je gewoon benaderen:
XSLT:
1
node/subNode1/@attrib
Je kan ze idd wel benaderen, maar alleen via de attribute axis. het @ teken is een afkorting voor het gebruik van de attribute axis..
een attribute is echter geen child van een element.

The one who says it cannot be done, should never interrupt the one who is doing it.


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
Yup het werkt :o
Jammer alleen dat je eerst attnav.MoveToFirstAttribute(); moet doen :| Is niet echt handig.

https://k1600gt.nl


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

ik heb het niet geprobeerd, maar is het niet mogelijk om dan iets als
/node/subNode/attribute::* te gebruiken als query ipv /node/subNode die je nu hebt?
Dan heb je ook maar 1 loop nodig.

The one who says it cannot be done, should never interrupt the one who is doing it.


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
cspare schreef op vrijdag 21 december 2007 @ 14:33:
ik heb het niet geprobeerd, maar is het niet mogelijk om dan iets als
/node/subNode/attribute::* te gebruiken als query ipv /node/subNode die je nu hebt?
Dan heb je ook maar 1 loop nodig.
Ik heb geen idee. Binnen de loop wordt nu een functie aangeroepen voorzien van de juiste params. Die moet ik nu een beetje aanpassen zodat wanneer het bij de MoveToFirst al goed is de MoveToNext loop niet hoeft worden doorlopen. Beetje truttig is het wel maarja ik weet even niets beters. Kan er pas na mijn vakantie weer mee verder :|

https://k1600gt.nl

Pagina: 1