2016-08-03 36 views
0

Ich versuche, eine MSXML zu analysieren, die eine Antwort von einem Web Services über XmlStreamReader ist.Apex: Wie bekomme ich alle Kind Elemente eines XML? - Parsing xml über XmlStreamReader

Der Code unten ist die Antwort vom Web-Service:

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <Worksheet ss:Name="Report"> 
     <Table> 
      <Row> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Project Name</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Project Code</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Project URI Report Setting</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Entry Date</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Actual Billable Hours (Selected Dates)</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Actual Non-Billable Hours (Selected Dates)</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">User Name</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">User Default Billing Rate</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">User Default Billing Rate (BC)</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Timesheet Start Date</Data> 
       </Cell> 
       <Cell ss:StyleID="Default"> 
        <Data ss:Type="String">Timesheet End Date</Data> 
       </Cell> 
      </Row> 
     </Table> 
    </Worksheet> 
</Workbook> 

ich alle cell(s) in jeder Zeile erhalten wollte.

Hier ist mein Code, wie analysiere ich die Antwort (davon ausgehen, dass reportXML ist die Antwort):

class Cell { 
     string data { get; set; } 
} 

XmlStreamReader xsr = new XmlStreamReader(reportXML); 

while(xsr.hasNext()) { 
     if (xsr.getEventType() == XmlTag.START_ELEMENT) { 
      if (xsr.getLocalName() == 'Row') { 
       Cell cell = parseCell(xsr); 
       system.debug(cell); 
      } 
     } 
     xsr.next(); 
} 

Cell parseCell(XmlStreamReader reader) { 
     Cell cell = new Cell(); 

     while(reader.hasNext()) { 
      if (reader.getEventType() == XmlTag.END_ELEMENT) { 
       break; 
      } 
      else if (reader.getEventType() == XmlTag.CHARACTERS) { 
       cell.data = reader.getText(); 
      } 

      reader.next(); 
     } 

     return cell; 
} 

Das Problem ist, ich bin nur eine einzelne Zelle bekommen und nicht die ganze Zelle. Cell:[data=Project Name] ist die einzige Daten aus den Debug-Logs, die ich denke nur die erste Spalte Zelle.

Warum? und was ist der Code, der die Logik zur Anzeige aller Zellendaten beeinträchtigt?

Antwort

0

Ein paar Gedanken:

  1. Sie möchten Ihre data Variable ein Array von String Datentyp sein, anstatt einem einzigen String.

  2. Um unangenehme Überraschungen zu vermeiden, kann es hilfreich sein, zu überprüfen, ob die XmlTag.START_ELEMENT tatsächlich eine Cell ist.

  3. Nachdem Sie den data Variable als Array definieren, können Sie die add() Methode verwenden, um jedes neue String an das Array (cell.data.add(reader.getText());) hinzuzufügen.