Avatar billede beef12 Nybegynder
18. oktober 2005 - 14:54 Der er 25 kommentarer og
1 løsning

Erstatte tekst i xml fil

Her er et simpelt eksempel af hvad jeg ønsker at foretage mig:

Hvis jeg har en xml-fil, som f.eks. indeholder:
<xml><tag><hej>asdda</hej></xml></xml>

og ønsker at erstatte < med &lt; og > med &gt;
men kun imellem <tag>

således at output bliver:
<xml><tag>&lt;hej&gt;asdda&lt;/hej&gt;</xml></xml>

Hvordan skulle
Avatar billede beef12 Nybegynder
18. oktober 2005 - 14:55 #1
hov...

Hvordan skulle jeg gribe det an?

skulle der stå der til sidst :-)
Avatar billede arne_v Ekspert
18. oktober 2005 - 14:56 #2
Skulle det ikke have været i en CDATA oprindeligt (sidem hej er data og ikke
et XML tag) ?
Avatar billede beef12 Nybegynder
18. oktober 2005 - 14:59 #3
ved jeg ikke. Principielt set vil jeg bare have at alt imellem <tag></tag> bliver til data.
Avatar billede beef12 Nybegynder
18. oktober 2005 - 15:00 #4
ja - og der tale om en fejl i mit spm. Der står "</xml></xml>". Der burde stå "</tag></xml>"
Avatar billede beef12 Nybegynder
18. oktober 2005 - 15:09 #5
er spørgsmålet forståeligt?
Avatar billede arne_v Ekspert
18. oktober 2005 - 15:25 #6
ja

problem stillingen er bare ikke særligt XML'sk

det er ikke muligt bare at lave en String Replace ?

eller sagt på en andne måde - hvad er elt præcist kriteriet for at noget skal
erstates ?
Avatar billede arne_v Ekspert
18. oktober 2005 - 15:25 #7
helt
Avatar billede beef12 Nybegynder
18. oktober 2005 - 15:58 #8
Kriteriet er:
Hvis readeren støder på "<tag>" så erstat alle forekomster at < og > indtil readeren rammer en forekomst af </tag>.

Jeg ved godt hvordan jeg lave en replace. Jeg ved dog ikke hvordan jeg skal gøre det udelukkende imellem start og slut tag, så resten af filen bliver upåvirket.

Spørgsmålet er også stillet under katagorien C#, så det betyder vel ikke noget hvis der problemstillingen ikke er XML-agtig :-)
Avatar billede arne_v Ekspert
18. oktober 2005 - 16:17 #9
forslag:

using System;
using System.Text.RegularExpressions;

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string s = "<xml><tag><hej>abc</hej></tag><tag>abc<br/>def</tag></xml>";
            Console.WriteLine(s);
            string s2 = s;
            MatchCollection res = Regex.Matches(s,"(?:<tag>)(.*?)(?:</tag>)");
            for(int i = 0; i < res.Count; i++) {
                s2 = s2.Replace(res[i].Groups[1].Value,res[i].Groups[1].Value.Replace("<","&lt;").Replace(">","&gt;"));
            }
            Console.WriteLine(s2);
        }
    }
}
Avatar billede beef12 Nybegynder
20. oktober 2005 - 08:21 #10
ser fint ud - men hvis der nu er tale om xml fil og ikke en string? Hvordan kan jeg fyre den ind i regex.Match ?
Eller skal jeg append'e xml-filen til en string i programmet?
Avatar billede beef12 Nybegynder
20. oktober 2005 - 08:42 #11
Jeg har fundet frem til følgende, men det skriver bare en tom fil:

            StreamReader s = new StreamReader(test);
            string s2 = s.ReadToEnd();
            MatchCollection res = Regex.Matches(s2,"(?:<tag>)(.*?)(?:</tag>)");
            for(int i = 0; i < res.Count; i++)
            {
                s2 = s2.Replace(res[i].Groups[1].Value,res[i].Groups[1].Value.Replace("<","&lt;").Replace(">","&gt;"));
            }       
            s.Close();
            StreamWriter wrtFormatted = new StreamWriter(output2);
            wrtFormatted.Write(s2);
            wrtFormatted.Close();
Avatar billede beef12 Nybegynder
20. oktober 2005 - 14:46 #12
den er ikke tom - men den replacer ikke noget som helst tilgengæld
Avatar billede arne_v Ekspert
20. oktober 2005 - 14:49 #13
du skal nok lige bede den håndtere linieskift !
Avatar billede arne_v Ekspert
20. oktober 2005 - 14:50 #14
MatchCollection res = Regex.Matches(s2,"(?:<tag>)(.*?)(?:</tag>)", RegexOptions.Multiline);
Avatar billede beef12 Nybegynder
20. oktober 2005 - 15:22 #15
Jeg tror at det er de quotes (") i min fil som dræber regex'en. Kan det passe?
Avatar billede arne_v Ekspert
20. oktober 2005 - 15:26 #16
har du prøvet med Multiline ?
Avatar billede beef12 Nybegynder
20. oktober 2005 - 15:29 #17
ja...
Avatar billede beef12 Nybegynder
20. oktober 2005 - 15:32 #18
her er et eksempel på hvad der kan stå imellem <tag> o0g </tag> hvor alle < og > skal erstattes:

      <saw:report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <saw:criteria subjectArea="&quot;test&quot;">
          <saw:columns>
            <saw:column formula="&quot;Service &quot;.ROW_ID" columnID="c0" />
            <saw:column formula="Activity.&quot;Activity Relation&quot;" columnID="c1" />
            <saw:column formula="&quot;Service Request&quot;.&quot;SR#&quot;" columnID="c2" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Internal&quot;" columnID="c3" />
            <saw:column formula="&quot;Service Request&quot;.Class" columnID="c4" />
            <saw:column formula="&quot;Service Request&quot;.Priority" columnID="c5" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Updated By&quot;" columnID="c6" />
            <saw:column formula="&quot;Service Request&quot;.Substate" columnID="c7" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Requested Delivery Date (local time)&quot;" columnID="c8" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Response Date (local time)&quot;" columnID="c9" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Days Since Created&quot;" columnID="c10" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Days Since Updated&quot;" columnID="c11" />
            <saw:column formula="Activity.Type" columnID="c12" />
            <saw:column formula="Activity.&quot;Owner Login&quot;" columnID="c13" />
            <saw:column formula="Account.&quot;Account Name&quot;" columnID="c14" />
          </saw:columns>
          <saw:filter
          </saw:filter>
        </saw:criteria>
      </saw:report>
Avatar billede beef12 Nybegynder
20. oktober 2005 - 15:53 #19
Det er sq rimelig meget opad bakke det her...
Spørgsmålet er om det overhovedet kan løses eller om jeg skal gribe opgaven an på en anden måde...
Avatar billede arne_v Ekspert
20. oktober 2005 - 15:54 #20
jeg er på sporet !
Avatar billede arne_v Ekspert
20. oktober 2005 - 15:56 #21
using System;
using System.IO;
using System.Text.RegularExpressions;

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {

            StreamReader sr = new StreamReader(@"C:\snask.xml");
            string s = sr.ReadToEnd();
            string s2 = s;
            MatchCollection res = Regex.Matches(s,"(?:<tag>)(.*?)(?:</tag>)", RegexOptions.Multiline | RegexOptions.Singleline);
            for(int i = 0; i < res.Count; i++) {
                s2 = s2.Replace(res[i].Groups[1].Value,res[i].Groups[1].Value.Replace("<","&lt;").Replace(">","&gt;"));
            }
            StreamWriter sw = new StreamWriter(@"C:\snask2.xml");
            sw.Write(s2);
            sw.Close();
        }
    }
}
Avatar billede arne_v Ekspert
20. oktober 2005 - 15:56 #22
<xml>
  <tag>
      <saw:report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <saw:criteria subjectArea="&quot;test&quot;">
          <saw:columns>
            <saw:column formula="&quot;Service &quot;.ROW_ID" columnID="c0" />
            <saw:column formula="Activity.&quot;Activity Relation&quot;" columnID="c1" />
            <saw:column formula="&quot;Service Request&quot;.&quot;SR#&quot;" columnID="c2" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Internal&quot;" columnID="c3" />
            <saw:column formula="&quot;Service Request&quot;.Class" columnID="c4" />
            <saw:column formula="&quot;Service Request&quot;.Priority" columnID="c5" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Updated By&quot;" columnID="c6" />
            <saw:column formula="&quot;Service Request&quot;.Substate" columnID="c7" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Requested Delivery Date (local time)&quot;" columnID="c8" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Response Date (local time)&quot;" columnID="c9" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Days Since Created&quot;" columnID="c10" />
            <saw:column formula="&quot;Service Request&quot;.&quot;Days Since Updated&quot;" columnID="c11" />
            <saw:column formula="Activity.Type" columnID="c12" />
            <saw:column formula="Activity.&quot;Owner Login&quot;" columnID="c13" />
            <saw:column formula="Account.&quot;Account Name&quot;" columnID="c14" />
          </saw:columns>
          <saw:filter
          </saw:filter>
        </saw:criteria>
      </saw:report>
  </tag>
</xml>
Avatar billede arne_v Ekspert
20. oktober 2005 - 15:56 #23
<xml>
  <tag>
      &lt;saw:report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;saw:criteria subjectArea="&quot;test&quot;"&gt;
          &lt;saw:columns&gt;
            &lt;saw:column formula="&quot;Service &quot;.ROW_ID" columnID="c0" /&gt;
            &lt;saw:column formula="Activity.&quot;Activity Relation&quot;" columnID="c1" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;SR#&quot;" columnID="c2" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;Internal&quot;" columnID="c3" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.Class" columnID="c4" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.Priority" columnID="c5" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;Updated By&quot;" columnID="c6" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.Substate" columnID="c7" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;Requested Delivery Date (local time)&quot;" columnID="c8" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;Response Date (local time)&quot;" columnID="c9" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;Days Since Created&quot;" columnID="c10" /&gt;
            &lt;saw:column formula="&quot;Service Request&quot;.&quot;Days Since Updated&quot;" columnID="c11" /&gt;
            &lt;saw:column formula="Activity.Type" columnID="c12" /&gt;
            &lt;saw:column formula="Activity.&quot;Owner Login&quot;" columnID="c13" /&gt;
            &lt;saw:column formula="Account.&quot;Account Name&quot;" columnID="c14" /&gt;
          &lt;/saw:columns&gt;
          &lt;saw:filter
          &lt;/saw:filter&gt;
        &lt;/saw:criteria&gt;
      &lt;/saw:report&gt;
  </tag>
</xml>
Avatar billede arne_v Ekspert
20. oktober 2005 - 15:57 #24
Multiline er vist ikke nødvenigt - det er Singleline som gør det

(og navnet er vist lidt misvisende !)
Avatar billede beef12 Nybegynder
20. oktober 2005 - 16:38 #25
Skiftet multiline ud med singleline og nu virker det perfekt.
Smid svar og få nogle meget velfortjente points.
Avatar billede arne_v Ekspert
20. oktober 2005 - 17:17 #26
svar
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