Avatar billede slughead Nybegynder
24. oktober 2007 - 15:56 Der er 9 kommentarer og
1 løsning

XML - SelectSingleNode

Hey...

Jeg har et xml-dokument:

<?xml version="1.0" encoding="utf-8" ?>
  <Report xmlns="DumpePct" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="aName">
    <table1>
      <Detail_Collection>
...blah blah...
      </Detail_Collection>
    </table1>
  </Report>

Min kode ser ud som følger:

...
XmlDocument doc = new XmlDocument();
doc.Load(ms);
                   
XmlNamespaceManager man = new XmlNamespaceManager(doc.NameTable);    man.AddNamespace("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
               
XmlNode table1Node = doc.DocumentElement.SelectSingleNode("table1");
...

Overstående eksempel virker i .NET 2.0, men ikke i 1.1, hvor table1Node bliver null - hvorfor!?

Sagen er bare den, at det skal virke i 1.1 :P
Nogen forslag?
Avatar billede nielle Nybegynder
24. oktober 2007 - 15:59 #1
Prøv med:

XmlNode table1Node = doc.DocumentElement.SelectSingleNode("//table1");
Avatar billede kalp Novice
24. oktober 2007 - 16:15 #2
prøv istedet sådan her..

XmlNamespaceManager man = new XmlNamespaceManager(new NameTable());
man.AddNamespace("ns","http://www.w3.org/2001/XMLSchema-instance");
XmlNode table1Node = doc.SelectSingleNode("//ns:table1"),man);
Avatar billede kalp Novice
24. oktober 2007 - 16:16 #3
sidste linje fik en parantes for meget

XmlNode table1Node = doc.SelectSingleNode("//ns:table1",man);
Avatar billede slughead Nybegynder
24. oktober 2007 - 16:45 #4
Har prøvet begge overstående forslag.
samme fejl: "Object reference not set to an instance of an object"
Avatar billede slughead Nybegynder
24. oktober 2007 - 16:57 #5
ah!
Jeg har fået det løst - delvis ud fra kalp's forslag :)

pointen er, at der i mit xml-dokument er to namespaces, "DumpePct" og "xmlns:xsi"
Så er det muligt selv at vælge 'navn' på DumpePct, da denne er udefineret som sådan (kan sikkert forklares bedre, men pyt :P)

løsningen:

XmlNamespaceManager man = new XmlNamespaceManager(doc.NameTable);
man.AddNamespace("dump", "DumpePct");
XmlNode table1Node = doc.SelectSingleNode("//dump:table1",man);

og så kan jeg gå videre her fra...
XmlNode Detail_CollectionNode = table1Node.SelectSingleNode("//dump:Detail_Collection", man);
...
Avatar billede kalp Novice
24. oktober 2007 - 17:30 #6
Det var jo godt nok:)
Du er velkommen til at afslutte spørgsmålet ved selv at lægge svar:)
Avatar billede slughead Nybegynder
29. oktober 2007 - 13:32 #7
hmm... en ny problematik er dukket op... min xml ser nu ud som følger:

<report Name="blah">
  <pct>
    <collection>
      <elem>
        <elem_collection>
          <subelement/>
        </elem_collection>
      </elem>
      <elem>
        <elem_collection>
          <subelement/>
          <subelement/>
          <subelement/>
        </elem_collection>
      </elem>
      <elem>
        <elem_collection>
          <subelement/>
          <subelement/>
        </elem_collection>
      </elem>
    </collection>
  </pct>
</report>

koden:

this.namesp = doc.DocumentElement.Attributes["Name"].Value;
XmlNamespaceManager man = new XmlNamespaceManager(doc.NameTable);
man.AddNamespace("dump", namesp);
           
XmlNode pctNode = doc.DocumentElement.SelectSingleNode("//dump:pct", man);
XmlNode collectionNode = pctNode.SelectSingleNode("//dump:collection", man);

foreach (XmlNode elemNode in collectionNode.ChildNodes)
{
  //blah1
  ...
  XmlNode elemCollectionNode = XmlNode.SelectSingleNode("//dump:elem_collection", man);
  foreach (XmlNode currSubElemNode in elemCollectionNode.ChildNodes)
  {
    //blah2
    ...
  }
}

Jeg henter information ud (se //blah1) om elemNode for hvert element - denne information er god nok.
Når jeg så vil hente information ud om currSubElemNode (se //blah2), får jeg altid information om det første subelement, dvs, ikke om det pågældende - som jeg ønsker.
Jeg har debugget mig frem til at elemCollectionNode altid har samme indhold (det er sikkert samme objekt), så min teori er at linien

  XmlNode elemCollectionNode = XmlNode.SelectSingleNode("//dump:elem_collection", man);

.. er forkert.

Nogen forslag?
Avatar billede slughead Nybegynder
29. oktober 2007 - 13:52 #8
glemte lige at skrive, at xmlns i root element har samme værdi som Name-attributten.
Avatar billede slughead Nybegynder
29. oktober 2007 - 14:22 #9
(jeg skal lære at forsøge ordentligt selv inden jeg skriver her...)

Løsning:

XmlNode elemCollectionNode = XmlNode.SelectSingleNode("//dump:elem_collection", man); kan erstattes med:
XmlNode detailCollectionNode = currSchoolNode.ChildNodes[0];

Så virker det :)
Avatar billede slughead Nybegynder
29. oktober 2007 - 14:28 #10
(der gik noget galt med den paste...)

XmlNode detailCollectionNode = currSchoolNode.ChildNodes[0];

skulle selvfølgelig være

XmlNode elemCollectionNode= elemNode.ChildNodes[0];
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester