2016-06-10 18 views
0

Ich habe eine XML-Datei, die ich versuche zu lesen und für eine spätere Bearbeitung in eine neue Textdatei mit vb.net umzuschreiben.Logik zum Lesen einer XML-Datei in vb.net

Ich bin in der Lage, die XML erfolgreich zu lesen und auszudrucken, aber ich habe Probleme, die richtigen mit dann Anfangs- und End-Tags jedes Elements/Attributs zu bekommen.

Ich benutze ein 'XmlNodeReader', um das Dokument zu lesen, indem Sie den Namen und den Wert jedes gelesenen erhalten. Dann wird ein Auswahl Fall mit xmlNodeType.Element oder xmlNodeType.EndElement

Wie erhalte ich die richtige Logik dieses Problem zu lösen, da einige XML-Linien in der Form sind <Server Type="PropertyDefinitions"> und andere sind in Form <Server Type="aServerName"/>

Ive eine versucht, wenn Schleife für endEntity unter anderem schien aber keiner zu funktionieren. Hier ist (Teil von) mein Code, der die Lese- und Schreibfunktion zeigt. Wenn ich nicht genügend Informationen zur Verfügung gestellt habe, lass es mich wissen.

 Dim reader As XmlNodeReader = New XmlNodeReader(document) 
    Dim result As New StringBuilder 
     While reader.Read 
     Select Case reader.NodeType 

      Case XmlNodeType.Element 
      result.Append("<" & reader.Name) 

        If reader.HasAttributes Then 
         While reader.MoveToNextAttribute() 
          result.Append(" " + reader.Name + "=" + Chr(34) + reader.Value + Chr(34)) 
         End While 

         If XmlNodeType.EndEntity Then 
          result.Append("/>") 
         End If 
        Else 
         If XmlNodeType.Entity Then 
          result.Append(">") 
         ElseIf XmlNodeType.EndEntity Then 
          result.Append("/>") 
         End If 
        End If 

      Case XmlNodeType.EndElement 
       result.Append("</" + reader.Name + ">") 

     End Select 
    End While 

Beispiel Probe des XML, die die drei verschiedenen Arten von Tags zeigt:

<DocumentSMG Version="6.900000" VersionSeemage="6.12.0.2428"> 
    <Server Type="PropertyDefinitions"> 
     <MetaProperties> 
     </MetaProperties> 
    </Server> 
     <Server Type="aServerType1"> 
     <BOM.Sort.Ascendant Value="1"/> 
    </Server> 
     <Server Type="aServerType2"/> 
     <Server Type="aServerType3"/> 
    </DocumentSMG> 
+1

Gibt es einen Grund, warum Sie nicht ein XmlDocument verwenden? Es würde Ihnen erlauben, alle Änderungen zu speichern, ohne das XML selbst zu schreiben. –

Antwort

0

Versuchen Sie, diese

Imports System.Xml 
Imports System.Xml.Linq 
Module Module1 
    Const FILENAME As String = "c:\temp\test.xml" 
    Sub Main() 
     Dim reader As XmlReader = XmlReader.Create(FILENAME) 

     While Not reader.EOF 
      If reader.Name <> "Server" Then 
       reader.ReadToFollowing("Server") 
      End If 
      If Not reader.EOF Then 
       Dim server As XElement = XElement.ReadFrom(reader) 
       Dim type As String = server.Attribute("Type") 
       Select Case type 
        Case "PropertyDefinitions" 

        Case "aServerType1" 

        Case "aServerType2" 

        Case "aServerType3" 

       End Select 

      End If 

     End While 



    End Sub 

End Module 
0

Ich würde Ihnen empfehlen, stattdessen versuchen, die XDocument Klasse und Linq verwenden hierfür. Mit diesem XML (XMLFile.xml):

<?xml version="1.0" encoding="utf-8" ?> 
<DocumentSMG Version="6.900000" VersionSeemage="6.12.0.2428"> 
    <Server Type="PropertyDefinitions"> 
    <MetaProperties> 
    </MetaProperties> 
    </Server> 
    <Server Type="aServerType1"> 
    <BOM.Sort.Ascendant Value="1"/> 
    </Server> 
    <Server Type="aServerType2"/> 
    <Server Type="aServerType3"/> 
</DocumentSMG> 

Sie das Dokument wie folgt lesen:

Dim xml = XDocument.Load("XMLFile.xml") 

jetzt sicher, ich bin nicht genau das, was Sie aus der Datei extrahieren möchten, aber lassen Sie uns sagen Server-Knoten eines bestimmten Typs wollen nur:

Dim serverNodes = xml...<Server>.Where(Function(node) [email protected] = "aServerType1") 

... ist ein Alias ​​für die Nachkommen Eigenschaft @ bezeichnet ein Attribut

Also sucht das obige nach Knoten, die Nachkommen des Dokumentstamms mit einem Type-Attribut sind, das "aServerType1" enthält.

Sie können Werte auch direkt in XDocument ändern und dann speichern.

das Dokument speichern:

xml.Save("NewXMLFile.xml")