2009-09-29 53 views
1

我對這個XML解析有點新鮮。所以,如果你能幫助我,我會很感激。Java + XML問題

我需要提取一些數據,這是它的結構是一個XML文檔中:Java桌面應用程序中

<DWDocument DW5BasketFileName="DOCU0001.001"> 
    <FileInfos> 
    <ImageInfos> 
     <ImageInfo id="0,0,0" nPages="0"> 
     <FileInfo fileName="PATH_1" dwFileName="FILE_NAME_1" signedFileName="FILE_NAME_2" type="normal" length="77324" /> 
     </ImageInfo> 
    </ImageInfos> 
    </FileInfos> 
    <FileDatas /> 
    <Section number="0" startPage="0" dwguid="d8a50daf-d4df-4012-ad0c-85e26a6e0755"> 
    <Metadata version="0"> 
     <FieldProperties> 
     <TextVar length="20" field="FIELD_1" id="0">9866627</TextVar> 
     <TextVar length="20" field="FIELD_2" id="1">78050830431</TextVar> 
     <TextVar length="40" field="FIELD_3" id="32">GOMEZ PADILLA</TextVar> 
     <TextVar length="40" field="FIELD_4" id="33">JOSSER KICO</TextVar> 
     <Date field="FIELD_5" id="64">1985-07-02T00:00:00</Date> 
     </FieldProperties> 
    </Metadata> 
    </Section> 
</DWDocument> 

我。我不知道該怎麼做,如果它可能可能是一個代碼示例。

我需要提取FIELD_1到FIELD_4的值(986627,...),每一個都是不同的變量。

謝謝。

回答

4

U可以使用XPath


String filename = "C:\\a.xml"; 
String expression = "//TextVar"; 
try { 
Document document = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder().parse(new File(filename)); 
NodeList nn = (NodeList) XPathFactory.newInstance().newXPath() 
    .evaluate(expression, document, XPathConstants.NODESET); 
for (int i = 0; i < nn.getLength(); i++) { 
    Node item = nn.item(i); 
    String field = item.getAttributes().getNamedItem("field").getTextContent(); 
    String number = item.getTextContent(); 
    System.out.println("field=" + field); 
    System.out.println("number=" + number); 
} 
} catch (Exception e) { 
throw new RuntimeException(e); 
} 

輸出:

 
field=FIELD_1 
number=9866627 
field=FIELD_2 
number=78050830431 
field=FIELD_3 
number=GOMEZ PADILLA 
field=FIELD_4 
number=JOSSER KICO 
+0

你是個天才。對不起,我不能投更多:D謝謝! – Sheldon 2009-09-29 19:13:38

0

如果這是整個XML文檔,那麼您可以使用正則表達式來提取「>」和「」之間的字符。這將爲您節省大量構建DOM文檔的開銷(例如通過使用JDOM)或處理來自SAX解析器的回調。

+0

沒有使用正確的XML解析器在解析XML感覺就像一個危險的路徑。除此之外,正則表達式也會捕獲FIELD_5。 – Buhb 2009-09-29 20:09:40

3

如果您的需求僅限於從一個XML文檔中提取值,並沒有更多的,XPath查詢就足夠了。

Sun JRE帶有一個內置的XML解析器,XSLT轉換器和XPath引擎。在其他JRE上,您需要打包Xalan等XPath引擎。

一個很好的教程,讓你在XPath in Java 5 is available at IBM Developerworks上引導。

最重要的類來啓動Java API文檔中referrring到會

  • 的DocumentBuilderFactory
  • 的DocumentBuilder
  • 文件
  • 的XPathFactory
  • 的XPath
  • XPathExpression
  • XPathConstants中

前三個類將幫助您將XML文檔的內容加載到對象中,以便以後在XPath查詢中使用。從創建XPath表達式和將表達式的結果轉換回應用程序中合適的對象的角度來看,後四類很重要。

+0

也謝謝你!我會檢查你提供給我的鏈接。 我認爲有必要添加到lib Xerces或更多。 – Sheldon 2009-09-29 19:14:23

+0

Xerces和Xalan已經在Sun Java 5 JRE和更高版本中提供。您可以在提供實際包的JAXP兼容性說明http://java.sun.com/j2se/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.html中找到更多詳細信息。但是,不要依賴實現版本,即內部包,而是使用DocumentBuilder,XPathFactory類等來避免問題。 – 2009-09-29 19:36:23

0

寫在VTD-XML同樣的代碼,如果你被那麼多工廠困惑:

import com.ximpleware.*; 

public class Example1 { 
    public static void main(String[] argv) throws Exception{ 
     VTDGen vg = new VTDGen(); 
     if (vg.parseFile("c:/test2.xml",true)){ 
      VTDNav vn = vg.getNav(); 
      AutoPilot ap = new AutoPilot(vn); 
      ap.selectXPath("//TextVar/text()"); 
      int i; 
      while((i=ap.evalXPath())!=-1){ 
       System.out.println(" text value ==>"+vn.toString(i)); 
      } 
     } 
    } 
} 

輸出

text value ==>9866627 
text value ==>78050830431 
text value ==>GOMEZ PADILLA 
text value ==>JOSSER KICO