Laden...
T
Telefisch
myCSharp.de - Member
80
Themen
375
Beiträge
Letzte Aktivität
vor einem Jahr
Dabei seit
28.04.2008
Erstellt vor einem Jahr

Jetzt muss ich aber doch nochmal fragen...

<?xml version="1.0"?>
-<Attribute AttributeDataType="xs:string" Name="Comment">

  <Value>Überspannungsschutz OK</Value>

    -<Attribute AttributeDataType="xs:string" Name="aml-lang=de-DE">

		<Value>Überspannungsschutz OK</Value>

	</Attribute>

</Attribute>

Bei diesem Ausschnitt habe ich ja innerhalb eines Attribute-Elements ein weiteres Attribute-Element.

foreach (XElement attr in elem.Descendants("Attribute"))
{
  	if (attr.Attribute("Name").Value.ToString() == "Comment")
    	comment = attr.Value.ToString();
}

Ich laufe mit dieser Schleife durch die Attribute-Elemente und möchte nur das Value vom Attribute-Element mit dem Namen Comment in die Variable schreiben.
Ich bekomme aber immer auch den zweiten Value, also in diesem Fall zweimal den gleichen Text hintereinander geschrieben.

Wieso passiert das ?

Erstellt vor einem Jahr

Ja, dass das XML eine Katastrophe ist, brauchen wir nicht drüber zu reden.

Es handelt sich hier um ein Exportformat mit dem in einem Programm zur Erstellung eines SPS-Programm eine Systemkonfiguration aufgebaut wird.
Export erfolgt aus einer unfassbar teuren ECAD-Software und importiert wird das normalerweise in TwinCat3 von Beckhoff...
Ich habe jetzt die ehrenvolle Aufgabe einzelne Detail daraus zu extrahieren um andere Prozesse damit zu füttern.

Aber wenn ich Dich richtig verstehe ist es nicht sinnvoll mit dem nächsten oder dem vorigen Element zu hantieren sondern generell den Parent-Node erneut zu durchsuchen, nach den gewünschten Elementen.

Danke so weit, kam mir etwas komisch vor aber ist eben so...

Erstellt vor einem Jahr

Hallo Ihr Wissenden,

ich bin bei Linq und XML noch blutiger Anfänger und stehe vor einem Problem, dass ich seit Stunden nicht zufriedenstellend gelöst bekomme.

Meine XML Datei sieht ausschnittsweise so aus:

     <InternalElement Name="ObjectName_02" ID="2511BBD2-3E9F-4D86-97D7-9E3FA09A7FFA">
      <Attribute Name="PositionNumber" AttributeDataType="xs:int">
       <Value>02</Value>
      </Attribute>
      <Attribute Name="TypeName" AttributeDataType="xs:string">
       <Value>ObjectName_02</Value>
      </Attribute>
      <Attribute Name="TypeIdentifier" AttributeDataType="xs:string">
       <Value>OrderNumber:KL6401-2</Value>
      </Attribute>
      <Attribute Name="PlantDesignation IEC" AttributeDataType="xs:string">
       <Value>=AKZ1</Value>
      </Attribute>
      <Attribute Name="LocationIdentifier IEC" AttributeDataType="xs:string">
       <Value>+OKZ1</Value>
      </Attribute>
      <Attribute Name="ProductDesignation IEC" AttributeDataType="xs:string">
       <Value>-KF02</Value>
      </Attribute>
      <Attribute Name="Manufacturer" AttributeDataType="xs:string">
       <Value>BEC</Value>
      </Attribute>
      <Attribute Name="Comment" AttributeDataType="xs:string">
       <Value>Kommunikation LON-BUS</Value>
       <Attribute Name="aml-lang=de-DE" AttributeDataType="xs:string">
        <Value>Kommunikation LON-BUS</Value>
       </Attribute>
      </Attribute>
      <SupportedRoleClass RefRoleClassPath="AutomationProjectConfigurationRoleClassLib/DeviceItem"/>
     </InternalElement>

Es geht darum, dass ich mehrere Elemente "InternalElement" habe und diese teilweise auch ineinander geschachtelt sind. Schlauerweise gibt es keine ordentlich benannten Elemente sondern irgendwie heißen alle für mich relevanten Elemente "Attribute".
Ich habe ja richtig verstanden, dass es sich hier NICHT um Attribute im Sinne des XML handelt, richtig?

Nun ich versuche zunächst mal aus dem ganzen Haufen einen Eintrag "Ordernummer" zu finden, von denen es mehrere gibt:

string TypeOfDevice = "";
foreach (XElement elem in ecad.Descendants("Attribute"))
    {
         try
         {
             if (elem.Value != null && elem.Value.ToString().Contains("OrderNumber"))
             {
                 TypeOfDevice = elem.Value.ToString().Substring(12);
                 Debug.Print(TypeOfDevice);

             }
          }
          catch
          {
             return;
          }
     }               

So weit so gut.
Problem ist folgendes.
Habe ich jetzt eine passende Ordernumber gefunden, möchte ich die zugehörigen Informationen sammeln.

Diese Informationen sind in folgenden Elementen enthalten.

      <Attribute Name="PlantDesignation IEC" AttributeDataType="xs:string">
       <Value>=AKZ1</Value>
      </Attribute>
      <Attribute Name="LocationIdentifier IEC" AttributeDataType="xs:string">
       <Value>+OKZ1</Value>
      </Attribute>
      <Attribute Name="ProductDesignation IEC" AttributeDataType="xs:string">
       <Value>-KF02</Value>
      </Attribute>

Da diese "Attribute" nach der Ordernumber kommen sollte das doch relativ einfach möglich sein. Mir fehlt grade nur irgendwie jeder Ansatz dazu.

Wäre der richtige Weg dieser hier, wo ich nochmal durch alle Elemente des Parents meines elem itteriere?:

foreach(XElement attr in elem.Parent.Descendants("Attribute"))
{
    if (attr.Value != null) Debug.Print(attr.Value.ToString());
}

Das sieht irgendwie etwas unbeholfen aus aber wäre das der Weg?

Gibt es da irgend etwas eleganteres?

Danke
Carsten

Erstellt vor 6 Jahren

Ach Abt, es ist immer wieder schön wie Du einen motivieren kannst.
Kannst Du Deine Kommentare nicht einfach mal für Dich behalten?

"Du hast Dich hier nicht eingearbeitet, Deine Programmierung stinkt, Alles was Du machst ist kein best practice"

Ich hab echt langsam keinen Bock mehr auf dieses Forum.
Ich habe den ganzen Tag überlegt, gestern ob ich hier überhaupt noch ne Farge stellen darf und prompt gibt's wieder auf's Maul!

Kenn zufällig jemand ein Anfängerfreundlicheres Forum als Dieses?
Ich bin's Leid!

Erstellt vor 6 Jahren

Ja, das Abholen der Daten ist sowiet kein Problem.
Nur wie bekomme ich sie an das Treeview gebunden, ohne die View neu zu laden?
Irgendwie stehe ich grade etwas auf'm Schlauch.

...würde man dann den Tree in eine partialview packen und nur die aktualisieren?
Geht das?

Erstellt vor 6 Jahren

Hallo Forum,
ich muss einen Treeview (bootstrap-treeview von Jon Miles) mit Daten füllen. Aufgabe dieses Treeviews ist eine Auswahl an Datensätzen anzuzeigen, die man dann als Vorlage zum Kopieren auswählt.
Da dieser Treeview aber nicht immer benötigt wird, wäre es sinnvoll ihn erst zu füllen wenn er wirklich gebraucht wird.

Dieser Tree ist derzeit in einem hidden modalen Dialog untergebracht und bekommt seine Daten als Json-Text über den ViewBag.
Nun möchte ich quasi in dem Moment wenn der modale Dialog sichtbar wird erst die Daten laden.

Idee war eine Action (JsonResult) mittels Ajax anzutriggern und die empfangenen Daten dann dem Treeview zuzuweisen.
Blöderweise muss dafür aber anscheinend die View neu geladen werden.
Wie könnte man so ein "popup"-Treeview anders erzeugen oder die Daten eben später in die View laden?

Das modale view derzeit:


    <!-- ################### Modaler Dialog zur Auswahl Copy ###################### -->
    <div class="modal fade" id="copyDialog" tabindex="-1" role="dialog" aria-labelledby="copyDialogLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <!-- Header -->
                <div class="modal-header">
                    <h5 class="modal-title" id="copyDialogLabel">Funktionsgruppe aus Vorlage kopieren</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>

                <!-- Body -->
                <div class="modal-body">
                    <form id="functionSelectForm">
                        <div id="copyTree" class=""></div>
                    </form>
                </div>

                <!-- Footer -->
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbrechen</button>
                    <button type="button" class="btn btn-primary" id="copyDialogOk">Ok</button>
                </div>
            </div>
        </div>
    </div>

Die Initialisierung sieht derzeit so aus:


    <!-- SCRIPTSECTION -->
    <script type="text/javascript">
// ########## COPYTREE #############
    //CopyTree Initialisieren
    var CopyTree;
    var treeData = @Html.Raw(ViewBag.copyData);
    CopyTree = $('#copyTree').treeview({
        data: treeData,
        showCheckbox: true,
        checkedIcon: "far fa-check-circle",
        uncheckedIcon: "far fa-circle",
        expandIcon: "fa fa-caret-right",
        collapseIcon: "fa fa-caret-down",
        emptyIcon: "fa",
        selectedIcon: "fa fa-map-marker-alt",
        showTags: true,
        levels: 0,
        enableLinks: true
    });
…

Erstellt vor 6 Jahren

Hallo Forum,
in einem anderen Threat hat man mich auf das Drei-Schichten Modell der Programmierung hingewiesen.
Nun dachte ich bisher, dass in ASP.NET MVC der Controller die Logik-Schicht ist, wobei offensichtlich wohl eher zur Präsentationsschicht gehört.

Meine Frage ist daher, wie bzw. wo implementiere ich die Businesslogik?

Derzeit besteht mein Projekt klassisch aus einer Datenbank, diversen Controllern und den zugehörigen Views.

Im Grunde wird ja ein Datensatz im Controller geladen und dem View übergeben:


FunctionGroup functionGroup = db.FunctionGroups.Find(id);
return View(functionGroup); 

Wie würde ich das denn mit einer zwischengeschalteten Logikschicht lösen?
Eine Trennung in drei Schichten macht schließlich nur Sinn, wenn ich sie konsequent überall einsetze.

Gruß Carsten

Erstellt vor 6 Jahren

Ok, dann fange ich nen neuen Threat an...