2013-11-11 4 views
0
<table index="1" title=" Final year marks of BIT students" ref="BIT results"> 
     <headings> 
      <heading>Semester1</heading> 
      <heading>Semester2</heading> 
      <heading>Semester3</heading> 
      <heading>Semester4</heading> 
      <heading>Grade</heading> 
      <heading>FYP</heading> 
     </headings> 
     <tablebody> 
      <tablerow> 
      <tablecell><item>10</item></tablecell> 
      <tablecell><item>12</item></tablecell> 
      <tablecell><item>13</item></tablecell> 
      <tablecell><item>15</item></tablecell> 
      <tablecell><item>B</item></tablecell> 
      <tablecell><item>B</item></tablecell> 
      </tablerow> 
     </tablebody> 
     </table> 
     <table index="2" title="Final year marks of COM students" ref="COM results"> 
     <headings> 
      <heading>Semester1</heading> 
      <heading>Semester2</heading> 
      <heading>Semester3</heading> 
      <heading>Semester4</heading> 
      <heading>Grade</heading> 
      <heading>FYP</heading> 
     </headings> 
     <tablebody> 
      <tablerow> 
      <tablecell><item>15</item></tablecell> 
      <tablecell><item>15</item></tablecell> 
      <tablecell><item>15</item></tablecell> 
      <tablecell><item>14</item></tablecell> 
      <tablecell><item>A</item></tablecell> 
      <tablecell><item>A</item></tablecell> 
      </tablerow> 
      <tablerow> 
      <tablecell><item>10</item></tablecell> 
      <tablecell><item>5</item></tablecell> 
      <tablecell><item>9</item></tablecell> 
      <tablecell><item>11</item></tablecell> 
      <tablecell><item>C</item></tablecell> 
      <tablecell><item>C</item></tablecell> 
      </tablerow> 
     </tablebody> 
     </table>`` 

Привет, я новичок в Xpath. Мне нужно извлечь данные таблицы XML с помощью Xpath. Вот мой XML-код. Я попытался, но не смог получить успешный выход.Как извлечь данные таблицы XML с использованием XPath

The output table would be like this 

semester1 semester2 semester3 semester4 grade fyp 
10   11   13  12   A B 

У кого-нибудь есть лучший способ приблизиться к этому? Спасибо :)

ответ

1

Во-первых, ваш пример XML недействителен. Либо вы предоставили два отдельных примера, либо вам не хватает окружающих родительских тегов.

Я принял второй и обернул вам примеры в тегах <tables></tables>.

Так что теперь на этой основе ...

<tables> 
    <table index="1" title=" Final year marks of BIT students" ref="BIT results"> 
     <headings> 
      <heading>Semester1</heading> 
      <heading>Semester2</heading> 
      <heading>Semester3</heading> 
      <heading>Semester4</heading> 
      <heading>Grade</heading> 
      <heading>FYP</heading> 
     </headings> 
     <tablebody> 
      <tablerow> 
       <tablecell> 
        <item>10</item> 
       </tablecell> 
       <tablecell> 
        <item>12</item> 
       </tablecell> 
       <tablecell> 
        <item>13</item> 
       </tablecell> 
       <tablecell> 
        <item>15</item> 
       </tablecell> 
       <tablecell> 
        <item>B</item> 
       </tablecell> 
       <tablecell> 
        <item>B</item> 
       </tablecell> 
      </tablerow> 
     </tablebody> 
    </table> 
    <table index="2" title="Final year marks of COM students" ref="COM results"> 
     <headings> 
      <heading>Semester1</heading> 
      <heading>Semester2</heading> 
      <heading>Semester3</heading> 
      <heading>Semester4</heading> 
      <heading>Grade</heading> 
      <heading>FYP</heading> 
     </headings> 
     <tablebody> 
      <tablerow> 
       <tablecell> 
        <item>15</item> 
       </tablecell> 
       <tablecell> 
        <item>15</item> 
       </tablecell> 
       <tablecell> 
        <item>15</item> 
       </tablecell> 
       <tablecell> 
        <item>14</item> 
       </tablecell> 
       <tablecell> 
        <item>A</item> 
       </tablecell> 
       <tablecell> 
        <item>A</item> 
       </tablecell> 
      </tablerow> 
      <tablerow> 
       <tablecell> 
        <item>10</item> 
       </tablecell> 
       <tablecell> 
        <item>5</item> 
       </tablecell> 
       <tablecell> 
        <item>9</item> 
       </tablecell> 
       <tablecell> 
        <item>11</item> 
       </tablecell> 
       <tablecell> 
        <item>C</item> 
       </tablecell> 
       <tablecell> 
        <item>C</item> 
       </tablecell> 
      </tablerow> 
     </tablebody> 
    </table> 
</tables> 

Я был в состоянии использовать ...

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class TestXPath { 

    public static void main(String[] args) { 
     try { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document doc = builder.parse(new File("Table.xml")); 

      XPathFactory xFactory = XPathFactory.newInstance(); 
      XPath path = xFactory.newXPath(); 
      XPathExpression exp = path.compile("/tables/table"); 
      NodeList nlTables = (NodeList) exp.evaluate(doc, XPathConstants.NODESET); 
      for (int tblIndex = 0; tblIndex < nlTables.getLength(); tblIndex++) { 

       Node table = nlTables.item(tblIndex); 
       Node nAtt = table.getAttributes().getNamedItem("title"); 
       System.out.println("Showing results for " + (nAtt == null ? "[Unknown]" : nAtt.getTextContent())); 

       exp = path.compile("headings/heading"); 
       NodeList nlHeaders = (NodeList) exp.evaluate(table, XPathConstants.NODESET); 
       Set<String> headers = new HashSet<String>(25); 
       for (int index = 0; index < nlHeaders.getLength(); index++) { 
        headers.add(nlHeaders.item(index).getTextContent().trim()); 
       } 

       for (String header : headers) { 
        System.out.printf("%-20s", header); 
       } 
       System.out.println(""); 

       exp = path.compile("tablebody/tablerow"); 
       NodeList nlRows = (NodeList) exp.evaluate(table, XPathConstants.NODESET); 
       for (int index = 0; index < nlRows.getLength(); index++) { 
        Node rowNode = nlRows.item(index); 
        exp = path.compile("tablecell/item"); 
        NodeList nlValues = (NodeList) exp.evaluate(rowNode, XPathConstants.NODESET); 
        List<String> values = new ArrayList<String>(25); 
        for (int valueIndex = 0; valueIndex < nlValues.getLength(); valueIndex++) { 
         values.add(nlValues.item(valueIndex).getTextContent().trim()); 
        } 
        for (String value : values) { 
         System.out.printf("%-20s", value); 
        } 
        System.out.println(""); 
       } 
       System.out.println(""); 
      } 

     } catch (ParserConfigurationException exp) { 
      exp.printStackTrace(); 
     } catch (SAXException | IOException | XPathExpressionException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

Для производства ...

Showing results for Final year marks of BIT students 
Semester1   Semester2   Semester3   Semester4   FYP     Grade    
10     12     13     15     B     B     

Showing results for Final year marks of COM students 
Semester1   Semester2   Semester3   Semester4   FYP     Grade    
15     15     15     14     A     A     
10     5     9     11     C     C 

В принципе, вам нужно чтобы иметь возможность разбивать каждую секцию на управляемые детали ...

Взгляните на XPath Tutorial и прочитайте примерно каждое сообщение о SO о XPath;)

+0

Благодарим вас за отзыв о моей программе. Я проверю это, и я дам вам знать, как это происходит. С уважением. –

Смежные вопросы