Avatar billede beef12 Nybegynder
04. oktober 2005 - 12:39 Der er 9 kommentarer og
1 løsning

Xpath i min C# kode

Hej,
Jeg har en XML fil, som jeg lige sidder og tester lidt xpath på, da jeg prøver at finde ud af prøcist hvordan det fungerer.

Her er et udsnit min inputfil:

<CatelogObj path ="c">
  <column>noget</column>
  <column>noget</column>
  <column>noget</column>
</CatelogObj>

Den prøver jeg så bare at læse og ommskrive til:

<path name="c">
<column>noget</column>
<column>noget</column>
<column>noget</column>
</path>

----------------------------------------------------

Her er min kode, hvordan går jeg columns til at fremkommer imellem mine path-noder ?


static void Main(string[] args)
        {
StreamWriter sw = new StreamWriter(outputFileName);
XPathDocument docNav = new XPathDocument(inputFileName);
XPathNavigator nav = docNav.CreateNavigator();
XPathNodeIterator NodeIter;
String strExpression = "//CatalogObj/@path";
NodeIter = nav.Select(strExpression);
           
while (NodeIter.MoveNext())
{
sw.Write("<path name=\"{0}\"</path>", NodeIter.Current.Value);
// så skal columns skrives her...
sw.WriteLine("</path>");
}
sw.Close();
Console.WriteLine("Done");
Console.ReadLine();           
}
Avatar billede arne_v Ekspert
04. oktober 2005 - 22:48 #1
Hvorfor ikke noget XSLT ?

Eksempel:

using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string input =
@"<xxx>
    <CatelogObj path='bogstaver'>
        <column>a</column>
        <column>bb</column>
        <column>ccc</column>
    </CatelogObj>
    <CatelogObj path='tal'>
        <column>1</column>
        <column>22</column>
        <column>333</column>
    </CatelogObj>
</xxx>";
            string transform =
@"<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:template match='/'>
<yyy>
<xsl:for-each select='//CatelogObj'>
<path>
<xsl:attribute name='name'><xsl:value-of select='@path'/></xsl:attribute>
<xsl:apply-templates/>
</path>
</xsl:for-each>
</yyy>
</xsl:template>
<xsl:template match='column'>
<column><xsl:value-of select='.'/></column>
</xsl:template>
</xsl:stylesheet>
";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(input);
            XslTransform xslt = new XslTransform();
            xslt.Load(new XmlTextReader(new StringReader(transform)), null, null);
            StringWriter sw = new StringWriter();
            XmlTextWriter wrt = new XmlTextWriter(sw);
            wrt.Formatting = Formatting.Indented;
            xslt.Transform(doc, null, wrt, null);
            Console.WriteLine(sw.ToString());
        }
    }
}
Avatar billede arne_v Ekspert
04. oktober 2005 - 22:48 #2
output:

<yyy>
  <path name="bogstaver">
    <column>a</column>
    <column>bb</column>
    <column>ccc</column>
  </path>
  <path name="tal">
    <column>1</column>
    <column>22</column>
    <column>333</column>
  </path>
</yyy>
Avatar billede beef12 Nybegynder
04. oktober 2005 - 23:37 #3
Det er bestemt ikke nogen dum ide. Det prøver jeg lige.
Avatar billede beef12 Nybegynder
05. oktober 2005 - 18:23 #4
det virker fint sådan som du har lavet det, men hvis jeg prøver at anvende min egen XML fil bliver jeg ved med at få en fejl:

Unhandled Exception: System.Xml.XmlException: The data at the root level is inva
lid. Line 1, position 1.

Det sker også hvis jeg kopier din XML over filen. Ved du hvad der er galt?
Avatar billede arne_v Ekspert
05. oktober 2005 - 18:29 #5
har du ændret fra

doc.LoadXml(xmlstring);

til

doc.Load(xmlfilename);
Avatar billede beef12 Nybegynder
05. oktober 2005 - 18:31 #6
næ ;-)

Tak for hjælpen - smid et svar
Avatar billede arne_v Ekspert
05. oktober 2005 - 18:35 #7
.
Avatar billede beef12 Nybegynder
06. oktober 2005 - 14:16 #8
her er en efterfølger: http://eksperten.dk/spm/653782
Håber du kan hjælpe Arne.
Avatar billede beef12 Nybegynder
06. oktober 2005 - 15:53 #9
endnu en efterfølger: http://eksperten.dk/spm/653787
Avatar billede arne_v Ekspert
06. oktober 2005 - 16:13 #10
jeg er ikke specielt god til XSLT - jeg kan kun sådan det mest almindelige
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

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger chef for Lokal IT i hovedstadsområdet

Capgemini Danmark A/S

IGNITE Graduate Program 2026

Nextway Software A/S

Product Configuration Specialist

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation