PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET 2.0 C#: Wie xml string konvertieren?


Elemental
2007-01-19, 10:09:53
Hallo zusammen,
ich suche nach einer einfachen Möglichkeit, einen xml string im Format

<OptoControlConfig>
<Line Name="\Box1\Line1" NetworkPath="\\sdd0276c\OptoControl" Enabled="1">
</Line>
<Line Name="\Box1\Line2" NetworkPath="\\sdd0158c\OptoControl" Enabled="0">
</Line>
</OptoControlConfig>


in das Format


<?xml version="1.0" standalone="yes"?>
<OptoControlDataSet xmlns="http://tempuri.org/OptoControlDataSet.xsd">
<OptoControlDataTable>
<LineColumn>line1</LineColumn>
<QDFileColumn>true</QDFileColumn>
<NetworkPathColumn>some path</NetworkPathColumn>
</OptoControlDataTable>
<OptoControlDataTable>
<LineColumn>line2</LineColumn>
<QDFileColumn>false</QDFileColumn>
<NetworkPathColumn>some path</NetworkPathColumn>
</OptoControlDataTable>
</OptoControlDataSet>


zu transformieren?

Geht sowas mit XSL Transformation?
Wenn ja, hat jemand evtl. nen Link, wo das erklärt wird? Hab bisher erfolglos gegoogelt... :(

mfG
Elemental

Gnafoo
2007-01-21, 01:21:37
Geht mit XSLT. Allerdings muss man da etwas rumprobieren, bis man drin ist. Ich kann dir als Nachschlagewerk [1] empfehlen. Ansonsten funktioniert bei mir folgendes (ich hoffe mal ich habe die Felder richtig interpretiert):

Transform.xslt

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns="http://tempuri.org/OptoControlDataSet.xsd"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output standalone="yes" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<OptoControlDataSet xmlns="http://tempuri.org/OptoControlDataSet.xsd">
<xsl:apply-templates/>
</OptoControlDataSet>
</xsl:template>

<xsl:template match="Line">
<OptoControlDataTable>
<LineColumn>
<xsl:call-template name="extract">
<xsl:with-param name="path" select="@Name"/>
</xsl:call-template>
</LineColumn>
<QDFileColumn>
<xsl:value-of select="boolean(number(@Enabled))"/>
</QDFileColumn>
<NetworkPathColumn>
<xsl:value-of select="@NetworkPath"/>
</NetworkPathColumn>
</OptoControlDataTable>
</xsl:template>

<xsl:template name="extract">
<xsl:param name="path"/>
<xsl:variable name="next" select="substring-after($path, '\')"/>

<xsl:choose>
<xsl:when test="boolean($next)">
<xsl:call-template name="extract">
<xsl:with-param name="path" select="$next"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$path"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>


C# Code

XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("Transform.xslt");

StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder))
{
using (XmlReader reader = XmlReader.Create(new StringReader(input)))
{
transform.Transform(reader, writer);
}
}

Console.WriteLine(builder.ToString());


Das einzige Problem: der StringBuilder erzeugt ein falsches Encoding. Keine Ahnung, wo das herkommt, aber das sind ja Feinheiten. Ansonsten wäre das Ganze sicher auch ganz brauchbar (evtl. sogar einfacher :D) mit nem XmlReader/-Writer gegangen. Aber das wär ja langweilig ;D.

[1] http://www.zvon.org/xxl/XSLTreference/Output/index.html

PS: Ja mir war grad langweilig :D.

Elemental
2007-01-21, 07:26:14
Ansonsten wäre das Ganze sicher auch ganz brauchbar (evtl. sogar einfacher :D) mit nem XmlReader/-Writer gegangen. Aber das wär ja langweilig ;D.


Ja, aber ich wollt halt mal was neues ausprobieren, weil ein Kollege gemeint hat, sowas könnte man "einfach" über XSLT machen ;) Allerdings bin ich dann ned wirklich weit gekommen :D

Werd am Montag in der Arbeit mal deinen Code testen. Danke jetzt schonmal!

mfG