[c#.net] xml namespace NullReferenceException

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil enkele elementen (subtotaal en totaal) van een xml-bestand inlezen, bv:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?> 
<testdocument xmlns="http://www.tweakers.net">
   <algemeen ID="1">
      <subtotaal>
         <getal>12</getal>
      </subtotaal>
      <totaal>
         <getal>34</getal>
      </totaal>
      <rij>
         <getal>1</getal>
      </rij>
      <rij>
         <getal>4</getal>
      </rij>
      <rij>
         <getal>2</getal>
      </rij>
   </algemeen>
</testdocument>


Dit doe ik door middel van deze code:

C#:
1
2
3
4
5
6
XmlDocument xmlDoc = new xmlDocument();
xmlDoc.LoadXml(strXml);
XmlNamespaceManager xmlns = new XmlNamespaceManager(xmlDoc.NameTable);
xmlns.AddNamespace("", xmlDoc.DocumentElement.NamespaceURI);
Console.WriteLine(xmlDoc.SelectSingleNode("/testdocument/algemeen/subtotaal/getal", xmlns);
Console.WriteLine(xmlDoc.SelectSingleNode("/testdocument/algemeen/totaal/getal", xmlns);


Met de default namespace krijg ik elke keer een NullReferenceException als ik het subtotaal of totaal wil uitlezen.

Wat doe ik verkeerd?

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
waarom doe je hier uberhaupt iets met namespaces... je hebt er maar 1.

(Trouwens gaat het ook fout als je het zonder namespaces probeert.. dat moet toch wat zeggen)
mm das ni zo :o

[ Voor 46% gewijzigd door BasieP op 17-08-2009 18:19 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Als je het veranderd naar het onderstaande doet hij het volgens mijn tests wel.
Geen idee waarom trouwens :?

C#:
1
2
3
4
5
6
XmlDocument xmlDoc = new xmlDocument();
xmlDoc.LoadXml(strXml);
XmlNamespaceManager xmlns = new XmlNamespaceManager(xmlDoc.NameTable);
xmlns.AddNamespace("x", xmlDoc.DocumentElement.NamespaceURI);
Console.WriteLine(xmlDoc.SelectSingleNode("/x:testdocument/x:algemeen/x:subtotaal/x:getal", xmlns);
Console.WriteLine(xmlDoc.SelectSingleNode("/x:testdocument/x:algemeen/x:totaal/x:getal", xmlns);

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat werkt inderdaad, bedankt!

Blijkbaar mag de prefix van de namespace niet leeg zijn, ook al werk je met de default namespace ...

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Dat is (zo ver ik weet) bij alle XPath-implementaties het geval. Als iets in een namespace staat moet altijd je altijd aangeven uit welke namespace je een element wilt hebben.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Wel raar, want MSDN zegt dat je wel degelijk een String.Empty kan opgeven om de default namespace te zetten:
The following prefix/namespace pairs are added by default to the XmlNamespaceManager. They can be determined at any scope.

Prefix-Namespace

xmlns-http://www.w3.org/2000/xmlns/ (the xmlns prefix namespace)

xml-http://www.w3.org/XML/1998/namespace (the XML namespace)

String.Empty-String.Empty (the empty namespace). This value can be reassigned a different prefix. For example, xmlns="" defines the default namespace to be the empty namespace
Maar goed een String.Empty zal dan ook wel geen "" zijn ;)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
RedRose schreef op woensdag 19 augustus 2009 @ 10:25:
Wel raar, want MSDN zegt dat je wel degelijk een String.Empty kan opgeven om de default namespace te zetten:


[...]


Maar goed een String.Empty zal dan ook wel geen "" zijn ;)
Van dezelfde pagina op MSDN:
If the XmlNamespaceManager will be used for resolving namespaces in an XML Path Language (XPath) expression, a prefix must be specified.
En tja; SelectSingleNode gebruikt inderdaad een XPath expressie. Kennelijk vindt iets binnen Microsoft's XML DOM classes dat String.Empty geen prefix is.

Ik zie in Joop_'s voorbeeldje trouwens wèl, dat hij geen XmlParserContext aanmaakt, zoals het voorbeeld op MSDN wel aangeeft.

Dat al eens geprobeerd, Joop_ ?

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Wat je ook nog zou kunnen proberen is om de xmlns declaratie eerst te verwijderen (via een regex bijvoorbeeld) voordat je de XML inleest.
Niet zo netjes natuurlijk, maar als je niet zo druk maakt om performance niets mis mee IMHO.

Ducati: making mechanics out of riders since 1946

Pagina: 1