[C#] SelectSingleNode geeft null

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

Onderwerpen


  • hneel
  • Registratie: Maart 2001
  • Laatst online: 12:55

hneel

denkt er het zijne van

Topicstarter
Let op: Ik ben nog een echte noob wat C# betreft.

Ik wil wat waardes uit een xml bestand inlezen en daarvoor gebruik ik (even versimpeld) de volgende file:

XML:
1
2
3
4
<gpx>
  <wpt>blabla</wpt>
  <wpt>blablabla</wpt>
</gpx>


C#:
1
  XmlNode oNodeWhereInsert = doc.SelectSingleNode("//gpx");


So far so good.

Maar eigenlijk moet die xml file er anders uit zien:

XML:
1
2
3
4
<gpx aaa=bbb ccc=ddd enz=etc>
  <wpt>blabla</wpt>
  <wpt>blablabla</wpt>
</gpx>


En dan probeer ik iets als

C#:
1
  XmlNode oNodeWhereInsert = doc.SelectSingleNode("//gpx[*]");


en dan krijg ik null als resultaat. Blijkbaar gaat dat met die wildcard fout. Hoe krijg ik dat goed?

(In werkelijkheid is wat er achter <gpx komt een string van bijna 400 karakters....)

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Zonder die wildcard gaat het dan toch gewoon goed?

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Wat wil je nu eigenlijk gaan selecteren ?

https://fgheysels.github.io/


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
De query wijzigt hiervoor niet volgens mij. Maar attributes van een node uitvragen doe je anders:
http://msdn2.microsoft.co...l.xmlnode.attributes.aspx

  • hneel
  • Registratie: Maart 2001
  • Laatst online: 12:55

hneel

denkt er het zijne van

Topicstarter
Wat ik wil is een aantal bestaande xml files mergen (waarbij geen dubbele items mogen voorkomen) en deze in een nieuwe file wegschrijven.

Ik begin dus met
C#:
1
doc.LoadXml("<gpx></gpx>");


Vervolgens heb ik verderop een loopje waar ik alle items toevoeg. Maar dat moet dan wel op het juiste niveau, dus tussen die <gpx> en </gpx>. Vandaar dat ik die oNodeWhereInsert nodig heb.

C#:
1
2
3
4
  foreach (DictionaryEntry entry in Lijstje)
  {
    oNodeWhereInsert.AppendChild(doc.ImportNode((XmlNode)entry.Value, true));
  }

Verwijderd

maar de node heet nog steeds gpx en die attributen zijn helemaal niet van belang bij het selecteren toch?

Acties:
  • 0 Henk 'm!

  • hneel
  • Registratie: Maart 2001
  • Laatst online: 12:55

hneel

denkt er het zijne van

Topicstarter
Maar door die attributen vind hij het niet meer...

Ik heb intussen al wat gevonden waardoor het wel werkt:
C#:
1
  XmlNode oNodeWhereInsert = doc.LastChild;


Dit is natuurlijk wel een dirty oplossing, maar het werkt in dit geval wel.

Toch zou ik graag weten hoe ik die wildcard had moeten invullen. Ik heb intussen geleerd dat het iets met xpath expressies te maken heeft.

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Volgens mij is dit door die rampe tempuri namespace bug. Je moet nl. een dummy namespace XmlNamespaceManager gebruiken voor dit soort dingen anders werkt het niet als er geen namespace is opgegeven.

Even een stukje code gecopieerd uit onze runtime:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
XmlNamespaceManager nsmgr = null;
string nsprefix = string.Empty;
if(node.NamespaceURI.Length>0)
{
    // has namespace specified. As .NET has some nice XML bugs, we have to specify a namespace manager and a fake prefix.
    nsmgr = new XmlNamespaceManager(node.OwnerDocument.NameTable);
    if(node.Prefix.Length<=0)
    {
        // use fake ns
        nsprefix = "entity";
    }
    else
    {
        nsprefix = node.Prefix;
    }
    nsmgr.AddNamespace(nsprefix, node.NamespaceURI);
    nsprefix += ":";
}


hier heb je die manager aangemaakt. Je gebruikt hem dan zo:
code:
1
XmlNode referenceNode = currentElement.SelectSingleNode(nsprefix + "ProcessedObjectReference", nsmgr);

succes :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1