2013-04-17 213 views
1

你能告訴我用示例代碼讀取Java中的XML文件的最佳方法嗎? XML內容如下。閱讀Java中的XML文件內容

<table sourceName="person" targetName="person"> 
     <column sourceName="id" targetName="id"/> 
     <column sourceName="name" targetName="name"/>`` 
</table> 

回答

0

因爲它是一個非常小的XML文件,我會用DOM解析,您可以在這裏找到一個完整的例子:

http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

但在本質:

File fXmlFile = new File("/Users/mkyong/staff.xml"); 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile); 

NodeList nList = doc.getElementsByTagName("table"); 

for (int temp = 0; temp < nList.getLength(); temp++) { 
    Node tableNode = nList.item(temp); 
    Element tableElement = (Element) tableNode; 

    System.out.println("Table source name: " + tableElement.getAttribute("sourceName")); 
    System.out.println("Table target name: " + tableElement.getAttribute("targetName")); 

    NodeList columnList = tableElement.getElementsByTagName("column"); 
    for (int j = 0; j < columnList.getLength(); j++) { 
     Node columnNode = columnList.item(j); 
     Element columnElement = (Element) columnNode; 

     System.out.println("Column source name: " + columnElement.getAttribute("sourceName")); 
     System.out.println("Column target name: " + columnElement.getAttribute("targetName")); 


    } 
} 

請請參閱示例頂部的相關導入。

希望它能幫助, A.

+0

嗨,我的配置文件包含多個表配置,我必須閱讀表關聯的列,並需要一些過程。配置文件看起來像 \t <表SOURCENAME = 「人」 目標名稱= 「人」> \t \t <柱SOURCENAME = 「ID」 目標名稱= 「ID」/> \t \t <柱SOURCENAME = 「名稱」 目標名稱=」命名 「/> \t \t <表SOURCENAME =」 部門」目標名稱= 「部門」> \t \t <柱SOURCENAME = 「DEPTID」 目標名稱= 「ID」/> \t \t <柱SOURCENAME = 「DEPTNAME」 目標名稱=「name」/> \t

+0

我已經編輯了我的答案:首先遍歷表,然後遍歷列。 – santamanno

3

我會用JAXB,試試這個,它的工作原理

public class Test1 { 
    @XmlAttribute 
    String sourceName; 
    @XmlAttribute 
    String targetName; 
    @XmlElement(name = "column") 
    List<Test1> columns; 

    public static Test1 unmarshal(File file) { 
     return JAXB.unmarshal(file, Test1.class); 
    } 
} 
+1

這是一個有用但不完整的答案。它應該添加必要的導入並顯示JAXB變量的來源。這適用於我: import java.io.File; import javax.xml.bind。JAXBContext中; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation。*; JAXBContext jaxbContext = JAXBContext.newInstance(Test1.class); Unmarshaller JAXB = jaxbContext.createUnmarshaller(); return JAXB.unmarshal(file,Test1.class); 在異常處理塊內:try {...} catch(JAXBException e){...} –

1

你可以使用Simple形式簡單的XML序列化:

import org.simpleframework.xml.Serializer; 
import org.simpleframework.xml.core.Persister; 

public class App { 

    public static void main(String[] args) throws Exception { 
     String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 
       + "<table sourceName=\"person\" targetName=\"person\">\n" 
       + " <column sourceName=\"id\" targetName=\"id\"/>\n" 
       + " <column sourceName=\"name\" targetName=\"name\"/>``\n" 
       + "</table>"; 
     Serializer serializer = new Persister(); 
     Table table = serializer.read(Table.class, xml); 
     System.out.println(table.getSourceName()); 
     System.out.println(table.getTargetName()); 
     for (Column colunmn : table.getColumns()) { 
      System.out.println(colunmn.getSourceName()); 
      System.out.println(colunmn.getTargetName()); 
     } 
    } 
} 

Table

import java.util.List; 
import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.ElementList; 
import org.simpleframework.xml.Root; 

@Root(name = "table") 
public class Table { 

    @Attribute 
    private String sourceName; 
    @Attribute 
    private String targetName; 
    @ElementList(name = "column", inline = true) 
    private List<Column> columns; 

    public Table() { 
    } 

    public String getSourceName() { 
     return sourceName; 
    } 

    public void setSourceName(String sourceName) { 
     this.sourceName = sourceName; 
    } 

    public String getTargetName() { 
     return targetName; 
    } 

    public void setTargetName(String targetName) { 
     this.targetName = targetName; 
    } 

    public List<Column> getColumns() { 
     return columns; 
    } 

    public void setColumns(List<Column> columns) { 
     this.columns = columns; 
    } 
} 

Column

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Root; 

@Root(name = "column") 
public class Column { 

    @Attribute 
    private String sourceName; 
    @Attribute 
    private String targetName; 

    public Column() { 
    } 

    public String getSourceName() { 
     return sourceName; 
    } 

    public void setSourceName(String sourceName) { 
     this.sourceName = sourceName; 
    } 

    public String getTargetName() { 
     return targetName; 
    } 

    public void setTargetName(String targetName) { 
     this.targetName = targetName; 
    } 
} 
0

書已經寫在主題,這一切都取決於。如果文件結構簡單且穩定(它將元素/屬性映射到Java類,並且不希望每週更改和重新編譯Java類三次),那麼JAXB是一個不錯的選擇。

否則有一系列通用樹模型 - DOM是使用最廣泛,最古老和最差的;我會推薦JDOM2或XOM。

但理想的是避免將數據讀入Java; 「XRX」或「端到端XML」原則是針對整個應用程序使用面向XML的語言,例如XSLT和XQuery,如果您真的需要,可能會偶爾調用Java支持例程。