2016-11-04 1 views
0

Für unter xml ich möchte alle Zeile Knoten Wert lesen, wie Sie sehen, gibt es mehrere Zeile Tags unter Unterkategorie Tag, so für bestimmte Unterkategorie (angenommen für SubCategory ID = "Standard") Ich möchte alle Row Tags abrufen? Wie macht man das mit C#?Wie mehrere Tags mit demselben Namen unter Kind Knoten in einer XML-Datei mit C# lesen?

<DPS> 
    <Category ID="Handsets"> 
    <Device ID="Samsung"> 
     <Contract ID="twoFour"> 
     <Tariff ID="Standard4G"> 
      <SubCategory ID="Standard"> 
      <Row> 
       <Minutes>"Minutes":"999999"</Minutes> 
       <Texts>"Texts":"99999"</Texts> 
       <Data>"Data":"10000"</Data> 
       <Content>"Content":"No"</Content> 
       <Roaming>"Roaming":"Y + 2000"</Roaming> 
       <Monthly>"Monthly":"38"</Monthly> 
       <Upfront>"Upfront":0"</Upfront> 
      </Row> 
      <Row> 
       <Minutes>Minutes:999</Minutes> 
       <Texts>Texts:99994569</Texts> 
       <Data>Data:100</Data> 
       <Content>Content:No</Content> 
       <Roaming>Roaming:Y + 2000</Roaming> 
       <Monthly>Monthly:398</Monthly> 
       <Upfront>Upfront:0</Upfront> 
      </Row> 
      <Row> 
       <Minutes>Minutes:99</Minutes> 
       <Texts>Texts:92569</Texts> 
       <Data>Data:10</Data> 
       <Content>Content:No</Content> 
       <Roaming>Roaming:Y + 2000</Roaming> 
       <Monthly>Monthly:38</Monthly> 
       <Upfront>Upfront:0</Upfront> 
      </Row> 
      </SubCategory> 
      <SubCategory ID="RedValue"> 
      <Row> 
       <Minutes>"Minutes":"999999"</Minutes> 
       <Texts>"Texts":"99999"</Texts> 
       <Data>"Data":"10000"</Data> 
       <Content>"Content":"No"</Content> 
       <Roaming>"Roaming":"Y + 2000"</Roaming> 
       <Monthly>"Monthly":"38"</Monthly> 
       <Upfront>"Upfront":0"</Upfront> 
      </Row> 
      <Row> 
       <Minutes>Minutes:999</Minutes> 
       <Texts>Texts:99994569</Texts> 
       <Data>Data:100</Data> 
       <Content>Content:No</Content> 
       <Roaming>Roaming:Y + 2000</Roaming> 
       <Monthly>Monthly:398</Monthly> 
       <Upfront>Upfront:0</Upfront> 
      </Row> 
      <Row> 
       <Minutes>Minutes:99</Minutes> 
       <Texts>Texts:92569</Texts> 
       <Data>Data:10</Data> 
       <Content>Content:No</Content> 
       <Roaming>Roaming:Y + 2000</Roaming> 
       <Monthly>Monthly:38</Monthly> 
       <Upfront>Upfront:0</Upfront> 
      </Row> 
      </SubCategory> 
     </Tariff> 
     </Contract> 
    </Device> 
    </Category> 
</DPS> 
+0

Gibt es einen Grund für den Wert jedes Tags "Upfront: 0" statt nur "0"? – Poody

+0

das ist Tippfehler –

Antwort

1

Zuerst laden Sie die XML in ein XDocument.

var xdoc = XDocument.Parse(xml); // Or XDocument.Load(pathToXmlFile), etc.... 

Dann können Sie alle Unterkategorie Elemente für die eine mit der ID von „Standard“ abfragen und schließlich für alle untergeordneten Elemente fragen, die Reihen.

var rows = xdoc.Descendants("SubCategory") 
    .Where(sc => sc.Attribute("ID").Value == "Standard") 
    .Elements(); 

bearbeiten: Um die tatsächlichen Werte aus der obigen XML zu erhalten, ist dies eine Möglichkeit, es zu tun.

Ich habe eine Inline-Funktion gemacht, um ein bestimmtes Element aus der Reihe nach Namen zu bekommen und damit unerwünschte Zeichen daraus zu entfernen.

Func<XElement, string, string> getElementValue = (XElement row, string name) 
    => row.Element(name).Value 
     .Split(':').Last() // Take only the right side of the colons 
     .Trim('"'); // Remove the double quotes, if any 

Dann können wir sie verwenden für jede Zeile alle erwarteten Eigenschaften zu erhalten:

var rowData = rows.Select(x => new { 
    Minutes = getElementValue(x, "Minutes"), 
    Texts = getElementValue(x, "Texts"), 
    Data = getElementValue(x, "Data"), 
    Content = getElementValue(x, "Content"), 
    Roaming = getElementValue(x, "Roaming"), 
    Monthly = getElementValue(x, "Monthly"), 
    Upfront = getElementValue(x, "Upfront") 
}); 

Für echte Nutzung, werden Sie wahrscheinlich eine Klasse mit den Eigenschaften wie Minuten machen wollen, Texte usw. definiert, wenn Sie dies nicht bereits getan haben, und setzen Sie diesen Klassennamen nach dem Schlüsselwort new, in dem die Zeilen ausgewählt werden.

Edit 2: Mit den zusätzlichen Bits von Text in jedem Element anerkannt als "Tippfehler", können Sie die Inline-Funktion ganz überspringen und die rowData dazu wählen vereinfachen:

var rowData = rows.Select(x => new { 
    Minutes = x.Element("Minutes").Value, 
    Texts = x.Element("Texts").Value, 
    Data = x.Element("Data").Value, 
    Content = x.Element("Content").Value, 
    Roaming = x.Element("Roaming").Value, 
    Monthly = x.Element("Monthly").Value, 
    Upfront = x.Element("Upfront").Value 
}); 
+0

wie Wert aus variablen Zeilen zu holen? @UtopiaLtd –

+0

Zyklus durch die Sammlung in 'Zeilen' gespeichert – Poody

+1

Siehe oben.(Idealerweise sollten Sie in Erwägung ziehen, dass jedes Element in der Quell-XML genau den Inhalt hat, den Sie möchten, und nicht die redundante Kopie des Elementnamens, vorausgesetzt, Sie können dies steuern. Dadurch entfällt die Inline-Funktion zum Entfernen der Doppelpunkt, der vorhergehende Text und die Anführungszeichen.) – UtopiaLtd

0

Diese VB-Code konnte nicht mit dem Konverter, auf den ich Zugriff hatte, in C# konvertiert werden. Ich wusste, dass das XML-Literal kein Gegenstück in C# hat, aber für nichts anderes als einige Testdaten benötigt wird.

Da das XML gut strukturiert aussieht, habe ich eine Reihe von Klassen erstellt, die die Daten nachahmen. Sie sind nur ein Ausgangspunkt, weil ich die Daten nicht kannte.

Beginnen wir am Ende, indem wir jede Zeile in Standard betrachten. Debuggen wurden hinzugefügt, um zu visualisieren.

Dim myDPS As New DPS(xe) 
    myDPS.Category.Device.Tariff.SubCategory.GetOnePart("Standard") 
    Debug.WriteLine(myDPS.Category.Device.Tariff.SubCategory.OnePart.ToString) 
    For Each el As XElement In myDPS.Category.Device.Tariff.SubCategory.Row.OnePart.Elements 
     Debug.WriteLine(el.ToString) 
    Next 

Hier sind die Klassen.

Public Class DPS : Inherits DPSBaseClass 

    Public Category As DPSCategory 

    Public Sub New(path As String) 
     MyBase.New(XElement.Load(path)) 
    End Sub 

    Public Sub New(element As XElement) 
     MyBase.New(element) 
     If Me.OnePart IsNot Nothing Then 
      Me.Category = New DPSCategory(Me.OnePart) 
     End If 
    End Sub 
End Class 

Public Class DPSCategory : Inherits DPSBaseClass 

    Public Device As DPSDevice 

    Public Sub New(element As XElement) 
     MyBase.New(element) 
     If Me.OnePart IsNot Nothing Then 
      Me.Device = New DPSDevice(Me.OnePart) 
     End If 
    End Sub 
End Class 

Public Class DPSDevice : Inherits DPSBaseClass 

    Public Tariff As DPSTariff 

    Public Sub New(element As XElement) 
     MyBase.New(element) 
     If Me.OnePart IsNot Nothing Then 
      Me.Tariff = New DPSTariff(Me.OnePart) 
     End If 
    End Sub 
End Class 

Public Class DPSTariff : Inherits DPSBaseClass 

    Public SubCategory As DPSSubCategory 

    Public Sub New(element As XElement) 
     MyBase.New(element) 
     If Me.OnePart IsNot Nothing Then 
      Me.SubCategory = New DPSSubCategory(Me.OnePart) 
     End If 
    End Sub 
End Class 

Public Class DPSSubCategory : Inherits DPSBaseClass 

    Public Row As DPSSubCategoryRow 

    Public Sub New(element As XElement) 
     MyBase.New(element) 
     If Me.OnePart IsNot Nothing Then 
      Me.Row = New DPSSubCategoryRow(Me.OnePart) 
     End If 
    End Sub 
End Class 

Public Class DPSSubCategoryRow : Inherits DPSBaseClass 

    Public Sub New(element As XElement) 
     MyBase.New(element) 
    End Sub 
End Class 

Public MustInherit Class DPSBaseClass 

    Private TheData As XElement 
    Private DataParts As New List(Of XElement) 
    Public OnePart As XElement 

    Public Sub New(path As String) 
     Me.New(XElement.Load(path)) 
    End Sub 

    Public Sub New(element As XElement) 
     Me.TheData = element 
     Me.GetDataParts() 
    End Sub 

    Public Sub GetDataParts() 
     Me.DataParts = (From el In Me.TheData.Elements Select el).ToList 
     Me.GetOnePart("") 
    End Sub 

    Public Sub GetOnePart(ID As String) 
     If Me.DataParts.Count > 0 Then 
      If ID <> "" Then 
       Me.OnePart = (From el In Me.DataParts Where [email protected] = ID Select el Take 1).FirstOrDefault 
      Else 
       Me.OnePart = Me.DataParts.FirstOrDefault 
      End If 
     End If 
    End Sub 

End Class 

Hier ist das nervtötende XML wörtliche die verwendet wurde, zu testen

Dim xe As XElement = <DPS> 
          <Category ID="Handsets"> 
           <Device ID="Samsung"> 
            <Contract ID="twoFour"> 
             <Tariff ID="Standard4G"> 
              <SubCategory ID="Standard"> 
               <Row> 
                <Minutes>"Minutes":"999999"</Minutes> 
                <Texts>"Texts":"99999"</Texts> 
                <Data>"Data":"10000"</Data> 
                <Content>"Content":"No"</Content> 
                <Roaming>"Roaming":"Y + 2000"</Roaming> 
                <Monthly>"Monthly":"38"</Monthly> 
                <Upfront>"Upfront":0"</Upfront> 
               </Row> 
               <Row> 
                <Minutes>Minutes:999</Minutes> 
                <Texts>Texts:99994569</Texts> 
                <Data>Data:100</Data> 
                <Content>Content:No</Content> 
                <Roaming>Roaming:Y + 2000</Roaming> 
                <Monthly>Monthly:398</Monthly> 
                <Upfront>Upfront:0</Upfront> 
               </Row> 
               <Row> 
                <Minutes>Minutes:99</Minutes> 
                <Texts>Texts:92569</Texts> 
                <Data>Data:10</Data> 
                <Content>Content:No</Content> 
                <Roaming>Roaming:Y + 2000</Roaming> 
                <Monthly>Monthly:38</Monthly> 
                <Upfront>Upfront:0</Upfront> 
               </Row> 
              </SubCategory> 
              <SubCategory ID="RedValue"> 
               <Row> 
                <Minutes>"Minutes":"999999"</Minutes> 
                <Texts>"Texts":"99999"</Texts> 
                <Data>"Data":"10000"</Data> 
                <Content>"Content":"No"</Content> 
                <Roaming>"Roaming":"Y + 2000"</Roaming> 
                <Monthly>"Monthly":"38"</Monthly> 
                <Upfront>"Upfront":0"</Upfront> 
               </Row> 
               <Row> 
                <Minutes>Minutes:999</Minutes> 
                <Texts>Texts:99994569</Texts> 
                <Data>Data:100</Data> 
                <Content>Content:No</Content> 
                <Roaming>Roaming:Y + 2000</Roaming> 
                <Monthly>Monthly:398</Monthly> 
                <Upfront>Upfront:0</Upfront> 
               </Row> 
               <Row> 
                <Minutes>Minutes:99</Minutes> 
                <Texts>Texts:92569</Texts> 
                <Data>Data:10</Data> 
                <Content>Content:No</Content> 
                <Roaming>Roaming:Y + 2000</Roaming> 
                <Monthly>Monthly:38</Monthly> 
                <Upfront>Upfront:0</Upfront> 
               </Row> 
              </SubCategory> 
             </Tariff> 
            </Contract> 
           </Device> 
          </Category> 
         </DPS> 

Hoffe, dass es einige Ideen Funken. Nochmals, Entschuldigung für die VB. Ich habe versucht, es zu konvertieren.

Verwandte Themen