1

你能告诉我用示例代码在 Java 中读取 XML 文件的最佳方法吗?XML 内容如下所示。

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

4 回答 4

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);
    }
}
于 2013-04-17T08:02:02.850 回答
1

您可以使用简单形式的简单 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;
    }
}
于 2013-04-17T08:46:08.873 回答
0

关于这个主题的书籍已经写了,这一切都取决于。如果文件的结构简单且稳定(它将元素/属性映射到 Java 类,并且您不想每周更改和重新编译 Java 类 3 次),那么 JAXB 是一个不错的选择。

除此之外,还有一系列通用树模型——DOM 是使用最广泛、最古老和最差的;我会推荐 JDOM2 或 XOM。

但理想情况是完全避免将数据读入 Java;“XRX”或“端到端 XML”原则是在整个应用程序中使用面向 XML 的语言,例如 XSLT 和 XQuery,如果确实需要,可能偶尔调用 Java 支持例程。

于 2013-04-17T13:51:24.653 回答
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.

于 2013-04-17T07:10:51.520 回答