Avatar billede Lasse Novice
27. september 2005 - 17:21 Der er 4 kommentarer og
2 løsninger

Fejl i .NET Xml klasser!

Jeg kunne godt taenke mig at faa at vide om der er andre som ogsaa ser denne inkonsistens i .NET XML, eller om der er noget galt med mit .net framework! Jeg har foelgende xml fil:

<?xml version="1.0"?>
<MTSScene Version="311" ResetCamera="1">
  <MTSSceneParms RenderMode="LightTexture" ShowWidgets="0" AntiAlias="0" BlendShadow="1" ShadowY="-0.1313" ShadowOpacity="0.85" ShadowRadius="10" ShadowColor="0 0 0" AccumMax="12" EdgeBias="1" EdgeEffect="1" SortRule="-1" FilterMinimumMilliSecs="100" AntiAliasMinimumMilliSecs="333" ForceNoProxy="1" Prelite="0" PreliteColor="0 0 0.99" VirtualMouse="1">
    <Transform>
      <Scale />
      <Position />
      <Shear />
      <Rotate />
    </Transform>
  </MTSSceneParms>
  <MTSCamera OrbitDist="2.94">
    <Translate />
    <Pivot />
    <Scale />
    <Rotate x="35.52338" y="-28.64786" />
    <ViewLocation z="4" />
    <LookAt />
    <Translate2D />
    <Scale2D />
  </MTSCamera>
</MTSScene>

Jeg kunne godt taenke mig at fjerne alle tags der ikke har nogen attributter under sig (i sig selv eller i nogen af dens boern, boerneboern osv.). Jeg bruger xpath til at hente disse "uheldige" tags ud og fjerner dem derefter een efter een (btw. er der en smartere metode???). Dette goeres i c# saaledes:

System.Xml.XmlNodeList l = doc.SelectNodes("//*[count(.//@*) = 0]");

int t = l.Count; // Her er fejlen gemt. Hvis man fjerne dette kald, saa kommer der mindre iterationer i foreach loekken.

foreach(System.Xml.XmlNode node in l)
{
    node.ParentNode.RemoveChild(node);
    System.Diagnostics.Debug.WriteLine(node.Name);
}


Er der nogen der kan verificere denne inkonsistens? Ideen er selvfoelgelig at jeg laver det saaledes:

foreach(System.Xml.XmlNode node in doc.SelectNodes("//*[count(.//@*) = 0]"))
{
    node.ParentNode.RemoveChild(node);
    System.Diagnostics.Debug.WriteLine(node.Name);
}

men det giver mig ikke det rigtige resultat.
Avatar billede tuxic Nybegynder
27. september 2005 - 19:50 #1
Er det ikke som forventet? Iflg dokumentationen for XmlNodeList er det en "live" liste.

Alternativt kunne man sikkert også bruge en XmlNodeReader der løber henover over alle knuder.

Endnu mere eksotisk kunne man sikkert også bruge en xslt transformation
Avatar billede arne_v Ekspert
27. september 2005 - 19:59 #2
prøv evt. at slet dem i omvendt rækkefølge
Avatar billede Lasse Novice
27. september 2005 - 23:24 #3
tuxic>> I starten proevede jeg XSLT men det viste sig - til min store overraskelse - at vaere langsommere end XmlDocument metoden. Selv med en simpel identity transform er det langsommere. Det skulle vist blive rettet i .net 2.0.
Du har nok ret i at det er som forventet. Det sjove er at idet jeg kalder Count, saa loeber den alle nodes igennem...

Arne_v>> Gennemloeb bagfra. God ide. Jeg tror nu nok at min loesning virker, hvis jeg bare kalder Count.
Avatar billede Lasse Novice
27. september 2005 - 23:25 #4
Svar fra jer begge => point
Avatar billede arne_v Ekspert
27. september 2005 - 23:29 #5
svar
Avatar billede tuxic Nybegynder
28. september 2005 - 19:10 #6
Jep det er lidt pudsigt. XSLT er berømmet for at være langsomt (både at afvikle og udvikle [imo]).
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