Avatar billede lasserasch Juniormester
16. marts 2009 - 09:32 Der er 7 kommentarer og
1 løsning

Fjerne node fra Xmldocument.

Hejsa.

Jeg har nedenstående XMl document. Jeg har brug for at loope gennem dokumentet og finde de noder hvor tekst værdien i "title" feltet er ens. Jeg har nedenstående kode indtil videre. Men den fejler, og jeg kan ikke lige hitte ud af hvordan det skal gøres korrekt.

Jeg vil gerne have den til at slette <document> noden helt for nr. 2 entry, hvis der (som i nedenstående xml) er 2 <document> noder hvor Title indeholder nøjagtig samme tekst. Alle andre felter i noden er jeg ligeglad med.

Er der en som kan give en hjælpende hånd med dette?

Pft.

Mvh.
Lasse




!!-- Min C# Kode start --!!
Dictionary<string, int> count = new Dictionary<string, int>();

foreach (XmlNode node in result.SelectNodes("//Search/SearchResult/Document/Property[@name='Title']/text()"))
{
    if (count.ContainsKey(node.Value))
      result.RemoveChild(node);
    else
      count[node.Value] = 1;
}
!!-- Min C# Kode Slut --!!





!!-- Min XML start --!!

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Search id="{87ab58a7-310e-456b-912c-33401b4197ee}">
<SearchResult offset="0" num-results="3" total-num-results="3" search-time="14.9625" sort-time="0.3783" result-xml-build-time="5.189" dictionary-time="0.919" total-time="20.229" group-mode="enabled" next-page-href="/Soegning.aspx?group=_disabled&amp;id=&amp;page=2">

<GroupInfo>

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2008 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="NC.APO" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Doc1</Property>
<Property name="scPath">/Home/Doc1</Property>
<Property name="scUri">/doc1.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">testuser</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel på doc1</Property>
<Property name="Author"></Property>

<Markup name="Text">Test dokument 1</Markup>
</Document>

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2009 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="NC.APO" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Doc1-2</Property>
<Property name="scPath">/Home/Doc1-2</Property>
<Property name="scUri">/doc1-2.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">testuser</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel på doc1</Property>
<Property name="Author"></Property>

<Markup name="Text">Test dokument 1-2</Markup>
</Document>

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2008 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="NC.APO" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Doc1</Property>
<Property name="scPath">/Home/Doc1222222</Property>
<Property name="scUri">/doc122222.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">testuser</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel på doc2 tra la la la la laj.....</Property>
<Property name="Author"></Property>

<Markup name="Text">Test dokument 1</Markup>
</Document>


</GroupInfo>

</SearchResult>

</Search>
!!-- Min XML slut --!!
Avatar billede aaberg Nybegynder
16. marts 2009 - 09:43 #1
Prøv:

Dictionary<string, int> count = new Dictionary<string, int>();

XmlNodeList nodes = result.SelectNodes("//Search/SearchResult/Document/Property[@name='Title']/text()");

for (int idx = nodes.Count - 1; idx >= 0; idx--)
{
    if (count.ContainsKey(node.Value))
      result.RemoveChild(node);
    else
      count.Add(node.Value, 1);
}
Avatar billede aaberg Nybegynder
16. marts 2009 - 09:45 #2
Jeg tror din fejl skyldes at du fjerner en værdi fra en collection inde i en foreach løkke, som looper igennem selv samme collection. Ovenstående kodeeksempel bør løse dette, ved at bruge en for-løkke, og loope baglens igennem.

Hvis dette ikke løser problemet, bliver du nok nød til at poste din fejlmeddelelse.
Avatar billede lasserasch Juniormester
16. marts 2009 - 10:06 #3
Okay. Men i dit eksempel her, så er 'node' ikke defineret længere. Hvad skal jeg så gøre der?

Jeg er fuldstændig dummy hvad angår xml, så beklager hvis det er lidt dumme spørgsmål jeg stiller :-)
Avatar billede lasserasch Juniormester
16. marts 2009 - 10:31 #4
Jeg har lige forsøgt mig med en lille modificering af dit eksempel.

Jeg får fejlen "The node to be removed is not a child of this node".


Min kode ser sådan ud nu:

Dictionary<string, int> count = new Dictionary<string, int>();

        XmlNodeList nodes = result.SelectNodes("//Search/SearchResult/Document/Property[@name='Title']/text()");

        for (int idx = nodes.Count - 1; idx >= 0; idx--) {
          if (count.ContainsKey(nodes[idx].Value))
            result.RemoveChild(nodes[idx]);
          else
            count.Add(nodes[idx].Value, 1);
        }
Avatar billede aaberg Nybegynder
16. marts 2009 - 12:38 #5
Prøv at skifte denne linje:
result.RemoveChild(nodes[idx]);

ud med dette:
nodes[idx].ParentNode.RemoveChild(nodes[idx]);
Avatar billede lasserasch Juniormester
16. marts 2009 - 13:11 #6
Ja selvfølgelig....

Faktisk er det heller ikke helt rigtigt, men du gav mig idéen til den rigtige løsning. Noden skal jo ikke fjernes fra roden. Der findes den selvfølgelig ikke.

Der er jo faktisk intet som skal fjernes fra roden, da roden (result) er 'Search'. Så den endelige kode blev sådan her:


Dictionary<string, int> count = new Dictionary<string, int>();

XmlNodeList nodes = result.SelectNodes("//Search/SearchResult/Document/Property[@name='Title']/text()");

for (int idx = nodes.Count - 1; idx >= 0; idx--)
{
if (count.ContainsKey(nodes[idx].Value))
{
          nodes[idx].ParentNode.ParentNode.RemoveChild(nodes [idx].ParentNode);
}
else
count.Add(nodes[idx].Value, 1);
}
Avatar billede lasserasch Juniormester
16. marts 2009 - 13:26 #7
Så smid et svar for points og tak for hjælpen.

Mvh.
Lasse
Avatar billede aaberg Nybegynder
17. marts 2009 - 10:47 #8
Var så lidt :-)
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