2017-06-23 3 views
0

Ich habe eine XML, von der ich nur bestimmte Attribute nicht alle analysieren möchten. Ich habe 100 von Attributen und das von mir zur Verfügung gestellte XML ist ein Beispiel mit wenigen Attributen . Ich möchte die Namen der Attribute explizit angeben und ihre Werte analysieren. Bsp: Ich möchte die Werte der Attributnamen PersonN, VerifiedHuman analysieren In meiner Logik möchte ich die Werte durch Angabe von Attributnamen wie <Name>PersonN</Name> analysieren und den Wert analysieren Das Ergebnis sollte ein CSV sein.Parsen der XML durch Angabe der Attributnamen

<InterConnectResponse> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ConsumerSubjects> 
    <ConsumerSubject subjectIdentifier="Primary"> 
     <DataSourceResponses> 
     <RiskViewProducts> 
      <RiskViewAttribResponse> 
      <Attributes> 
       <Attribute> 
        <Name>PersonN</Name> 
        <Value>3</Value> 
       </Attribute> 
       <Attribute> 
        <Name>VerifiedHuman</Name> 
        <Value>2</Value> 
       </Attribute> 
       <Attribute> 
        <Name>CurrAddrBlockIndex</Name> 
        <Value>0.61</Value> 
       </Attribute> 
      ------ Many More Attributes --------- 
     </Attributes> 
     </RiskViewAttribResponse> 
    </RiskViewProducts> 
    </DataSourceResponses> 
    </ConsumerSubject> 
    </ConsumerSubjects> 
</InterConnectResponse> 

Logic Ich verwende: (Ich weiß nicht, wie die Attributnamen angeben und ihre Werte erhalten) In diesem Code str3 wird die obige xml.

using (XmlReader read = XmlReader.Create(new StringReader(str3))) 
{ 

    bool isValue = false; 
    while (read.Read()) 
    { 
     if (read.NodeType == XmlNodeType.Element && read.Name == "Value") 
     { 
      isValue = true; 
     } 

     if (read.NodeType == XmlNodeType.Text && isValue) 
     { 
      output.Append((output.Length == 0 ? "" : ", ") + read.Value); 
      isValue = false; 
     } 
    } 

} 

Erwartete Ausgabe:

3, 2 
+0

Bitte beachten Sie, dass das, was Sie "Attribute" nennen, nicht die Attribute sind, die normalerweise in XML genannt werden. Sie haben vielleicht keine Kontrolle darüber, aber es lohnt sich zumindest, sich darüber im Klaren zu sein, dass es verwirrend ist. –

+0

Was möchten Sie tun, wenn mehrere 'ConsumerSubject' Elemente vorhanden sind? –

Antwort

1

Es ist einfach, alle Werte in einem Wörterbuch zu erhalten. Dann können Sie nur die gewünschten extrahieren. Verwenden xml linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 


namespace ConsoleApplication63 
{ 
    class Program 
    { 
     const string XML_FILENAME = @"c:\temp\test.xml"; 
     const string CSV_FILENAME = @"c:\temp\test.csv"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(XML_FILENAME); 

      Dictionary<string, string> dict = doc.Descendants("Attribute") 
       .GroupBy(x => (string)x.Element("Name"), y => (string)y.Element("Value")) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 

      StreamWriter writer = new StreamWriter(CSV_FILENAME); 


      string[] attributesToRead = new[] { "CurrAddrTaxValue", "CurrAddrTaxMarketValue", "PrevAddrTaxValue" }; 
      //foreach (string attribute in attributesToRead) 
      //{ 
      // writer.WriteLine(string.Join(",", new string[] { attribute, dict[attribute] })); 
      //} 

      //all on one line 

      string output = string.Join(",", attributesToRead.Select(x => dict[x]).ToArray()); 
      writer.WriteLine(output); 

      writer.Flush(); 
      writer.Close(); 
     } 
    } 

} 
+0

Wie bekomme ich Werte aus dem Wörterbuch in eine CSV-Datei? – HadoopAddict

+0

Ich aktualisierte den Code, um in die CSV-Datei zu schreiben. – jdweng

+0

Ich mag diese Antwort wirklich. Aber wie bekomme ich nur Werte in die CSV-Datei für bestimmte Schlüssel? und in meiner CSV-Datei möchte ich nur Werte in einer einzelnen Zeile getrennt durch Kommas. Ich suche nach Code wie 'var attributesToRead = new [] {" CurrAddrTaxValue "," CurrAddrTaxMarketValue "," PrevAddrTaxValue "}; foreach (KeyValuePair Zeile in dict.AsEnumerable()) { writer.Write (string.Join ("," row.Value)) Wo (row.key => attributesToRead.Contains (ro); } '' Beispiel Ausgabe: 3, 2 ' – HadoopAddict

1

Wenn Sie zu einer Gruppe zum Beispiel Ihre Attribute wollen von Produkt, das Sie die folgende tun könnten.

var document = XDocument.Load(fileName); // or `= XDocument.Parse(xml);` 
var attributesToRead = new[] {"PersonN", "VerifiedHuman"}; 
var productsElements = document.XPathSelectElements("InterConnectResponse/ConsumerSubjects/ConsumerSubject/DataSourceResponses/RiskViewProducts"); 
var products = productsElements.Select(product => new 
{ 
    Attributes = product.XPathSelectElements("RiskViewAttribResponse/Attributes/Attribute").Select(attribute => new 
    { 
     Name = attribute.Element("Name")?.Value, 
     Value = attribute.Element("Value")?.Value 
    }).Where(attribute => attributesToRead.Contains(attribute.Name)) 
}); 

Um die gewünschte Ausgabe zu erhalten, können Sie dies tun.

foreach (var product in products) 
{ 
    foreach (var attribute in product.Attributes) 
    { 
     Console.WriteLine(attribute.Value + ", "); 
    } 
} 

Um eine CSV-Datei zu erstellen empfehle ich Ihnen, eine Bibliothek wie CsvHelper verwenden.

using (var writer = new StreamWriter(new FileStream(@"C:\mypath\myfile.csv", FileMode.Append))) 
{ 
    var csv = new CsvWriter(writer); 
    csv.Configuration.Delimiter = ","; 
    foreach (var product in products) 
    { 
     foreach (var attribute in product.Attributes) 
     { 
      csv.WriteField(attribute.Value); 
     } 
     csv.NextRecord(); 
    } 
} 
+0

Diese Methode analysiert alle Attribute. Ich möchte die Attribute spezifizieren, die ich analysieren möchte. – HadoopAddict

+0

Aber dieses csv überschreibt, wenn ich einige xmls analysiere. Wie füge ich Daten an es an? – HadoopAddict

+0

@HadoopAddict Ich habe die Antwort aktualisiert – NtFreX