Avatar billede fun22 Nybegynder
25. november 2007 - 18:16 Der er 30 kommentarer og
1 løsning

Redigere i XML fil

Hej

Jeg har en XML fil som ser således ud:

<?xml version="1.0" standalone="yes"?>
<MainChat>
  <Chat Msg="" DateTime="" User="" To="" />
  <Chat Msg="xcv" DateTime="18-11-2007 20:22:51" User="Jesper" To="All" />
  <Chat Msg="xcv" DateTime="18-11-2007 20:22:53" User="Jesper" To="All" />
  <Chat Msg="xcvxcv" DateTime="18-11-2007 20:22:56" User="Jesper" To="All" />
  <Chat Msg="lklæ" DateTime="18-11-2007 20:27:46" User="Jesper" To="All" />
  <Chat Msg="vbcbv" DateTime="18-11-2007 20:45:28" User="Jesper" To="All" />
</MainChat>

Hvordan laver jeg endnu en gruppe som hedder <Chat1></Chat1>??

Og hvordan kan jeg sortere i xml filen, hvor jeg kan vælge hvad jeg vil have vist?

Ligesom jeg kan når jeg bruger et dataset: WHERE User = 'Jesper' Order by .....
Avatar billede arne_v Ekspert
25. november 2007 - 18:20 #1
Læser ind i et XmlDocument, tilføjer og skriver ud igen.
Avatar billede kalp Novice
25. november 2007 - 18:23 #2
hvis man skal holde opbygningen så skal du oprette en attribut hvor du kan angive gruppen i.

f.eks

<Chat Group="1" Msg="xcv" DateTime="18-11-2007 20:22:51" User="Jesper" To="All" />

men ellers ville jeg smide alle sammen ind under deres egen node.

hvis du skal have vist noget specielt skal det først læses ind i XmlDocument og udlæses med f.eks

XmlNode udtraek  = xmldoc.SelectSingleNode("\Chat[@User = 'Jesper']");
Avatar billede kalp Novice
25. november 2007 - 18:23 #3
det vil udlæse den første besked fra Jesper..

Du kan google Xpath for at lære mere om emnet.
Avatar billede fun22 Nybegynder
25. november 2007 - 18:25 #4
hvad mener du med at smide dem ind under deres egen node?
Avatar billede arne_v Ekspert
25. november 2007 - 18:26 #5
Til selektion og sortering kan man lave en XSLT transformering.
Avatar billede arne_v Ekspert
25. november 2007 - 18:26 #6
Alternativt kan du prøv og se om du kan loade den XML ind i et DataSet og så bruge
"din sædvanelige metode".
Avatar billede kalp Novice
25. november 2007 - 18:26 #7
<?xml version="1.0" standalone="yes"?>
<MainChat>
<ChatGroup GroupId="1">
  <Chat Msg="" DateTime="" User="" To="" />
  <Chat Msg="xcv" DateTime="18-11-2007 20:22:51" User="Jesper" To="All" />
  <Chat Msg="xcv" DateTime="18-11-2007 20:22:53" User="Jesper" To="All" />
  <Chat Msg="xcvxcv" DateTime="18-11-2007 20:22:56" User="Jesper" To="All" />
  <Chat Msg="lklæ" DateTime="18-11-2007 20:27:46" User="Jesper" To="All" />
  <Chat Msg="vbcbv" DateTime="18-11-2007 20:45:28" User="Jesper" To="All" />
</ChatGroup>
</MainChat>
Avatar billede fun22 Nybegynder
25. november 2007 - 18:29 #8
Kalp >> Okay, det var nok det smarteste..

Arne_v >> Hvordan virker det XSLT ??
Avatar billede kalp Novice
25. november 2007 - 18:30 #9
XSLT fungerer lidt som et stylesheet.. men jeg kan sgu ikke lige anbefale det.
så hellere forsøge dataset metoden..

selv om jeg dog selv bare arbejder direkte med xml'en.
Avatar billede arne_v Ekspert
25. november 2007 - 18:32 #10
XSLT er et transformerings sprog til XML. Særdeles kraftfuldt. Ikke helt nemt at
komme igang med.

Men man kan omformatere, sortere, tilføje, fjerne etc..
Avatar billede fun22 Nybegynder
25. november 2007 - 18:33 #11
arne_v >> Kan du anbefale en artikel eller lille guide med et lille eksempel i??
Avatar billede arne_v Ekspert
25. november 2007 - 18:43 #12
Google finder bl.a.:
  http://www.w3schools.com/xsl/
  http://www.zvon.org/xxl/XSLTutorial/Books/Book1/index.html

Jeg har aldrig brugt dem selv. Jeg mener at roenving og olebole plejer at sige at der
er for langt mellem det korrekte på w3schools ...

Jeg kan evt. godt prøve at bixe et lille eksempel med din XML.
Avatar billede fun22 Nybegynder
25. november 2007 - 18:45 #13
Jeg kigger lige på dem.. Det må du da meget gerne ;)
Avatar billede arne_v Ekspert
25. november 2007 - 19:10 #14
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

namespace E
{
    public class MainClass
    {
        public static void Main(string[] args)
        {
            string transform =
@"<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:template match='/'>
<MainChat>
<xsl:for-each select='//Chat'>
<xsl:sort select='@DateTime' order='descending'/>
<xsl:if test='string-length(@User)>0'>
<Chat>
<xsl:attribute name='DateTime'><xsl:value-of select='@DateTime'/></xsl:attribute>
<xsl:attribute name='User'><xsl:value-of select='@User'/></xsl:attribute>
<xsl:attribute name='To'><xsl:value-of select='@To'/></xsl:attribute>
<xsl:value-of select='@Msg'/>
</Chat>
</xsl:if>
</xsl:for-each>
</MainChat>
</xsl:template>
</xsl:stylesheet>";
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\z.xml");
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(new XmlTextReader(new StringReader(transform)), new XsltSettings(true, true), null);
            StringWriter sw = new StringWriter();
            XmlTextWriter wrt = new XmlTextWriter(sw);
            wrt.Formatting = Formatting.Indented;
            xslt.Transform(doc, wrt);
            Console.WriteLine(sw.ToString());
        }
    }
}
Avatar billede arne_v Ekspert
25. november 2007 - 19:11 #15
Koden:
  - smider elemneter med tom User attribut væk
  - sorterer efter DateTime i omvendt orden
  - laver Msg om fra attribut til element værdi

Det er kun en demo af mulighederne. Og kompleksiteten i syntaxen.
Avatar billede fun22 Nybegynder
25. november 2007 - 19:44 #16
Jeg har nu leget lidt med det og også fået det til at spille.. Men hvordan laver jeg en Where i min løkke? Så jeg kan kun får dem hvor <To> er = med "All"??
Avatar billede arne_v Ekspert
25. november 2007 - 20:14 #17
se xsl:if tagget !
Avatar billede arne_v Ekspert
26. november 2007 - 01:07 #18
<xsl:if test="@To != ''">
...
</xsl:if>

men du skal lige håndtere de "" i C# - enten lig XSL'en ud i en separat fil eller dubler  dem.
Avatar billede fun22 Nybegynder
26. november 2007 - 16:29 #19
Hvorfor hedder den test? Kan man selv bestemme hvad den skal hedder?

Hvis jeg skriver sådan her:
<xsl:if test="@To = 'All'">

Så kommer der ingen ting, selvom der er to der står All ved..
Avatar billede fun22 Nybegynder
26. november 2007 - 16:48 #20
Har fundet ud af det.. Skulle slette @'et...

Kan man hente User.Identity.Name ind i xsl filen??
Avatar billede arne_v Ekspert
27. november 2007 - 02:17 #21
Man kan godt kalde C# kode inde fra XSL'en.

Men du kan også bare sætte en placeholder f.eks. @@identity@@ ind i XSL'en og så
lave en replace på den inden du bruger den til at transformere med.
Avatar billede arne_v Ekspert
27. november 2007 - 02:18 #22
og test skal være test !
Avatar billede fun22 Nybegynder
27. november 2007 - 17:10 #23
Okay jeg har prøvet med User.Identity.Name og det virker ikke..
Avatar billede arne_v Ekspert
28. november 2007 - 01:16 #24
Hvad præcist virker ikke ??
Avatar billede fun22 Nybegynder
29. november 2007 - 06:58 #25
hvis nu jeg skriver noget ala: <xsl:if test="@To = User.Identity.Name">
Avatar billede arne_v Ekspert
29. november 2007 - 16:01 #26
Det er ikke helt saa simpelt at kalde C# fra XSLT - jeg kan godt lave et eksempel.

Men du kommer hurtigst videre med den simple replace.
Avatar billede fun22 Nybegynder
29. november 2007 - 22:56 #27
Hvordan er det så du vil replace, sådan at jeg kan bruge det i min if løkke??
Avatar billede arne_v Ekspert
30. november 2007 - 01:50 #28
string transform = "... @@identity@@ ...";
...
transform = transform.Replace("@@identity@@", User.Identity.Name);
...
Avatar billede fun22 Nybegynder
28. januar 2008 - 22:22 #29
Arne smider du et svar?
Avatar billede arne_v Ekspert
28. januar 2008 - 22:48 #30
ok
Avatar billede fun22 Nybegynder
29. januar 2008 - 21:22 #31
Havde du tid til lige at kommentere her??

http://www.eksperten.dk/spm/816766
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



IT-JOB