2017-01-05 2 views
0

Ich versuche, durch Daten in einer XML-Datei in einer Anwendung mit Visual Basic, Build mit wpf, auf Windows 7 mit .net Framework 4.0 Ich habe viele Posts durchsucht auf diesem Forum (und anderen), aber ich bin verloren. Ich konnte keine richtige Dokumentation finden. Ich hoffe, dass mir jemand eine Antwort geben kann. Das ist mein XML-Schema:Wie kann ich XML-Daten nach Datum sortiert durchlaufen und eine Liste einer benutzerdefinierten Klasse abrufen?

<?xml version="1.0"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Changes"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element ref="change" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="change"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="engine" type="xs:string"/> 
       <xs:element name="reference" type="xs:string"/> 
       <xs:element name="code" type="xs:string"/> 
       <xs:element name="number" type="xs:integer"/> 
       <xs:element name="startdate" type="xs:date"/> 
       <xs:element name="stopdate" type="xs:date"/> 
       <xs:element name="location" type="xs:string"/> 
       <xs:element name="carracteristic" type="xs:string"/> 
       <xs:element name="tolmin" type="xs:string"/> 
       <xs:element name="tolmax" type="xs:string"/> 
       <xs:element name="correctiveaction" type="xs:string"/> 
       <xs:element name="correctiveactiondeadline" type="xs:date"/> 
       <xs:element name="duplicate" type="xs:boolean"/> 
       <xs:element name="type" type="xs:string"/> 
       <xs:element name="justification " type="xs:boolean"/> 
       <xs:element name="status" type="xs:string"/> 
       <xs:element name="nature" type="xs:string"/> 
       <xs:element name="ongoingactions" type="xs:string"/> 
       <xs:element name="actor" type="xs:string"/> 
       <xs:element name="timelimit" type="xs:string"/> 
       <xs:element name="justif" type="xs:string"/> 
       <xs:element name="newstatus" type="xs:string"/> 
       <xs:element name="linktomap" type="xs:string"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Was ich tun möchte, ist, eine Liste von change für ein bestimmtes reference zu erhalten, für das das aktuelle Datum zwischen den startdate und den stopdate besteht.

Bis jetzt habe ich es geschafft, eine Liste von 10 für meine Referenz zu bekommen.

Function applicableChanges(ByVal ref As String, ByVal changesfilepath As String) As List(Of change) 

    Dim xmlchange As New XmlDocument 

    xmlchange.Load(changesfilepath) 
    Dim changeList As XmlNodeList 
    changeList = root.SelectNodes("change[reference='" & ref & "']") 
End function 

Aber ich kann nicht weiter kommen.

1 Wie kann ich nur die Änderungen erhalten, die heute relevant sind (reference=ref and Now()>startdate and Now()<stopdate)?

Mein zweites Problem ist dann, wie man durch die extrahierten Daten geht. changeList ist eine XmlNodeList. Wie kann ich Attributwerte für jede Änderung in dieser Liste erhalten (wie number, code, ...).

Es muss eine Möglichkeit geben, diese XmlNodeList durchzulaufen, aber ich kann sie nicht finden.

Oder was ich dachte, könnte eine gute Idee sein, war eine VB-Klasse zu erstellen, die die gleichen Attribute wie meine XML-Elemente enthalten und irgendwie meine XmlNodeList in einer `List (Of change) konvertieren. Ich denke, das könnte Deserialisierung sein, wenn ich es richtig verstehe.

2 Was ist der beste Weg, um durch die extrahierten Daten zu navigieren, und wie?

Danke 'im Voraus für jede Hilfe.

+0

Ich würde vorschlagen, mit [XSD] (https://msdn.microsoft.com/en-us/library/x6c1kb0s (v = vs.110) .aspx) eine Klasse, deserialize zu erzeugen die Daten und verwenden Sie Linq, um die gewünschten Objekte aus der resultierenden Liste von 'change' auszuwählen und zu ordnen. – MrGadget

Antwort

0

Mr.Gadget bezieht sich auf das Tool Xsd.exe, das Ihr Schema in eine Reihe von Klassen konvertiert. Sie können dann Ihr XML in diese Objekthierarchie deserialisieren und alle Daten, die Sie benötigen, verwenden. C:

Auf meiner aktuellen Maschine kann es zu finden \ Program Files (x86) \ Microsoft SDKs \ Windows \ V10.0A \ bin \ netfx 4.6 Tools \ x64

Sie sollten in der Lage, es zu finden auf deinem.

Dieser Link: https://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx wird Ihnen helfen, zu verstehen, wie man es benutzt.

0

Vielen Dank für Ihre Antworten. Ich brauchte keine Zeit, um Xsd zu erkunden. Ich baute meine serialisierbare Klasse selbst auf. Ich behalte das für mich im Hinterkopf, wenn ich Zeit habe.

Allerdings verwendete ich Deserialisierung und Linq (ich wusste nicht darüber). Es funktioniert großartig. Linq ist wirklich stark.

Dank

Verwandte Themen