beispiel Parsen von unverzweigtem XML in C#




c# xml beispiel (2)

Sollte leicht in xml umgewandelt werden, mit dem man leichter arbeiten kann. So etwas macht jedes der Datenelemente in der XML zu einem <item> und damit zu der analysierten XML-Liste:

string startStr = "..."; // as above read it or whatever.

string validXML = startStr
   .Replace("<Horizon-Export><BatchNo.>","<Horizon-Export><item><BatchNo.>")
   .Replace(@"</Remarks><BatchNo.>",@"</Remarks></item><item><BatchNo.>")
   .Replace(@"</Remarks></Horizon-Export>",@"</Remarks></item></Horizon-Export>");

Je nach dem genauen Format der Quellzeichenfolge müssen Sie dies möglicherweise optimieren, aber es handelt sich um einen einfachen Algorithmus. Für das erste Element in der Liste müssen Sie <item> voranstellen. Fügen Sie zwischen den einzelnen Elementen </item><item> und fügen Sie dann </item> am Ende der Liste ein.

Ich weiß, dass Sie nichts damit zu tun haben, aber ich muss darauf hinweisen, dass das Mischen von Groß- und Kleinschreibung in XML-Tags und Attributnamen als wirklich schlechte Form angesehen wird. Alle XML-Tags sollten Kleinbuchstaben sein.

Ich erhalte XML von einer eingebetteten Maschine im folgenden Format:

<?xml version="1.0" encoding="utf-8"?>
<Horizon-Export>
  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:41:08 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>
  </UltimateForce>
  <UltimateStress>
  </UltimateStress>
  <Remarks>Pass</Remarks>

  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:47:10 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>25.3</UltimateForce>
  <UltimateStress>1.12</UltimateStress>
  <Remarks>Pass</Remarks>

  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:48:57 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>8.3</UltimateForce>
  <UltimateStress>0.37</UltimateStress>
  <Remarks>Pass</Remarks>

  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:49:20 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>10.9</UltimateForce>
  <UltimateStress>0.49</UltimateStress>
  <Remarks>Pass</Remarks>

  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:49:42 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>2.6</UltimateForce>
  <UltimateStress>0.12</UltimateStress>
  <Remarks>Pass</Remarks>
</Horizon-Export>

Es ist tatsächlich Testausgabe mit mehreren Testergebnissen in einem einzelnen XML. AFAIK die XML hat ein falsches Format, da alle Tests in einer einzigen Ebene sind und sie nicht verzweigt sind. Um das XML lesbar zu machen, lege ich eine Zeile zwischen die Ergebnismengen. Ein Testergebnis beginnt mit <BatchNo></BatchNo.> Und endet mit <Remarks></Remarks> . Ich habe eine Klasse für dasselbe. Für ein einzelnes Resultset oder verzweigtes Ergebnis kann ich analysieren, aber in diesem Fall wird mein Code nur einmal analysiert. Ich muss eine Liste von Klassen derselben erstellen.

Code, den ich verwende:

var root = XDocument.Load(path).Root;
var s = root.Element("BatchNo.").value; // and so on for other nodes.

Ich habe eine ähnliche Frage gestellt, da ich die tatsächliche Anforderung des Kunden nicht kannte. Jetzt sagten sie, es sei nicht ein Test, sondern das Ergebnis mehrerer Tests, also stelle ich erneut eine Frage. Bitte stimmen Sie nicht zu nahe oder runter.

Nicht möglich, XML mit LINQ in ASP.Net & C # zu analysieren


Answer #1

Versuche dies

class MX
{
    public string BatchNo { get; set; }
    public string SpecimenID { get; set; }
    //and so on
    static public List<MX> Arr = new List<MX>();
}
protected void Page_Load(object sender, EventArgs e)
{        
    XDocument doc = XDocument.Load(Server.MapPath("~/xml/a.xml"));
    List<string> ListBatchNo = new List<string>();
    foreach (var node in doc.Descendants("BatchNo."))
    {
        ListBatchNo.Add(node.Value);
    }
    List<string> ListSpecimenID = new List<string>();
    foreach (var node in doc.Descendants("SpecimenID"))
    {
        ListSpecimenID.Add(node.Value);
    }
    MX.Arr.Clear();
    for (int i = 0; i < ListBatchNo.Count; i++)
    {
        MX obj = new MX();
        obj.BatchNo = ListBatchNo[i];
        obj.SpecimenID = ListSpecimenID[i];
        MX.Arr.Add(obj);
    }
    GridView2.DataSource = MX.Arr;
    GridView2.DataBind();
}






linq-to-xml