Hallo Zusammen,
ich habe eine etwas komplizierte Aufgabe.
Ich soll aus einer XML Datei eine .udt (TIA Portal Import Datei) erstellen. Dabei muss ich den XML Code in ein passendes UDT Format anpassen.
<Section Name="None">
<Member Name="CalcDec" Datatype="Struct"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="en-US">dhgfgdh</MultiLanguageText></Comment>
<Member Name="VARI" Datatype="Struct"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList>
<Member Name="Count" Datatype="Int"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="Count_Inc" Datatype="Int"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="Count_MeanInc" Datatype="Int"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="Val_C_old" Datatype="Real"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="Time_Stamp_old" Datatype="DInt"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="Time_old_save" Datatype="Bool"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="Time_diff_DINT" Datatype="DInt"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="en-US">-------------------------END GSI_P_CZI_DEC_SETUP_1---------------------</MultiLanguageText></Comment></Member>
<Member Name="CurVal" Datatype="Array[0..1] of "CZI_CurVal""><AttributeList></AttributeList><Sections><Section Name="None">
<Member Name="Val_T" Datatype="DInt" />
<Member Name="Val_C" Datatype="Real" /></Section></Sections></Member>
<Member Name="IncVal" Datatype="Array[0..19] of "CZI_IncVal""><AttributeList></AttributeList><Sections><Section Name="None">
<Member Name="Inc" Datatype="Real" /></Section></Sections></Member>
<Member Name="MeanVal" Datatype="Array[0..19] of "CZI_MeanVal""><AttributeList></AttributeList><Comment><MultiLanguageText Lang="en-US">-------------------------BEGIN GSI_P_CZI_DEC_SETUP_2---------------------</MultiLanguageText></Comment><Sections><Section Name="None">
<Member Name="MeanInc" Datatype="Real" /></Section></Sections></Member></Member></Member>
<Member Name="test" Datatype="Bool"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList></Member>
<Member Name="test34" Datatype="Bool"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="en-US">hsfhfg</MultiLanguageText></Comment></Member>
<Member Name="testjd" Datatype="Bool"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="en-US">fgd</MultiLanguageText></Comment></Member>
<Member Name="sdf" Datatype="Bool"><AttributeList><BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="en-US">hfgdh</MultiLanguageText></Comment></Member>
</Section>
Sollte folgendemaßen aussehen:
TYPE "CZI_CalcDec"
VERSION : 0.1
//TITLE = CZI_CalcDec
//
// UDT-Struct for the data handling
//
//EDITOR: Robin Newitsch
STRUCT
CalcDec : Struct // dhgfgdh
VARI : Struct
Count : Int;
Count_Inc : Int;
Count_MeanInc : Int;
Val_C_old : Real;
Time_Stamp_old : DInt;
Time_old_save : Bool;
Time_diff_DINT : DInt; // -------------------------END GSI_P_CZI_DEC_SETUP_1---------------------
CurVal : Array[0..1] of "CZI_CurVal";
IncVal : Array[0..19] of "CZI_IncVal";
MeanVal : Array[0..19] of "CZI_MeanVal"; // -------------------------BEGIN GSI_P_CZI_DEC_SETUP_2---------------------
END_STRUCT;
END_STRUCT;
test : Bool;
test34 : Byte; // hsfhfg
tesjd : Word; // fgd
sdf : DWord; // hfgdh
END_STRUCT;
END_TYPE
Ich habe mit:
XmlDocument doc = new XmlDocument();
doc.Load("C:\\Users\\wbach\\Desktop\\Test\\DBs\\CZI_CalcDec.xml");
//Display all the book titles.
XmlNodeList elemSection = doc.GetElementsByTagName("Name");
WriteTxtTest("TYPE \"" + elemSection[0].InnerXml + "\"");
XmlNodeList elemValue = doc.GetElementsByTagName("Value");
string buildComment = elemValue[0].InnerXml.Replace(Environment.NewLine, Environment.NewLine + "//");
WriteTxtTest("//" + buildComment);
XmlNodeList elemMember = doc.GetElementsByTagName("Member");
foreach (XmlNode attrDatatype in elemMember)
{
string attrDatatypeStr = attrDatatype.Attributes["Datatype"].Value.ToString();
if (attrDatatypeStr == "Struct")
{
}
}
angefangen. Stoße aber schnell auf Grenzen, da die umformung automatisch funktionieren soll und der Code jedesmal anders aussieht. Zudem kann das Element Member noch andere Members enthalten.
Frage: Kann mir jemand hierzu einen TIpp geben, wie ich hierbei vorgehen könnte?
LG
@wbach
Der Ansatz, den du brauchst, heißt De-/Serialisierung.
Am besten wäre es wenn du deine XML deserialisieren lässt als entsprechendes Objekt.
Dann kannst du die Daten im neuen Format mit einem entsprechenden Seralisierer neu serialisieren.
Ob es eine einfache Möglichkeit gibt, die Daten als udt zu speichern, weiß ich leider nicht.
Hier musst du mal Google nutzen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
@wbach
Freut mich wenn ich helfen konnte 😃
Es wäre für andere auch hilfreich zu wissen, wie das Problem gelöst wurde.
Hast du dafür einen Seralisierer gefunden?
Wenn ja, wäre ein Link zu diesem für andere hilfreich.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Das ist XML. Da ist genau dieses Feature schon bei der Definition mit eingebaut (wie mfe schon richtig gesagt hat). Wenn du Daten als XML hast, solltest du auch die Vorteile von XML benutzen.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="/">
TYPE "CZI_CalcDec"
VERSION : 0.1
//TITLE = CZI_CalcDec
//
// UDT-Struct for the data handling
//
//EDITOR: Robin Newitsch
STRUCT
<xsl:apply-templates select="/Section/Member" />
END_STRUCT;
END_TYPE
</xsl:template>
<xsl:template match="Member[not(@Datatype='Struct')]">
<xsl:value-of select="@Name" /> : <xsl:value-of select="@Datatype" />;
</xsl:template>
<xsl:template match="Member[@Datatype='Struct']">
<xsl:value-of select="@Name" /> : Struct
<xsl:apply-templates select="Member" />
END_STRUCT
</xsl:template>
</xsl:stylesheet>
...und fertig. Serialisierung/Deserialisierung ist hier einfach das falsche Tool.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
@LaTino
Da muss ich dir recht geben.
Muss leider gestehen, dass ich bisher mit XSLT nie was gemacht habe.
Aber von Konzept her, wäre es hier wohl der bessere Ansatz.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.