Laden...

Aus XML Struktur ein File erstellen

Erstellt von wbach vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.422 Views
W
wbach Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren
Aus XML Struktur ein File erstellen

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 &quot;CZI_CurVal&quot;"><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 &quot;CZI_IncVal&quot;"><AttributeList></AttributeList><Sections><Section Name="None">
	<Member Name="Inc" Datatype="Real" /></Section></Sections></Member>
	
	<Member Name="MeanVal" Datatype="Array[0..19] of &quot;CZI_MeanVal&quot;"><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

T
2.224 Beiträge seit 2008
vor 6 Jahren

@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.

M
177 Beiträge seit 2009
vor 6 Jahren

Ist XSLT - Transformation keine Option für dich/euch?

W
wbach Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren

@ T-Virus,

danke das hat geklappt.

LG wbach

T
2.224 Beiträge seit 2008
vor 6 Jahren

@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.

3.003 Beiträge seit 2006
vor 6 Jahren

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)

T
2.224 Beiträge seit 2008
vor 6 Jahren

@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.