使用Java读取XML

时间:2012-12-01 23:34:31

标签: java xml

我看了几个例子,但是所有这些例子似乎都使用比我想读的更简单的XML文件。

以下是我正在尝试阅读的布局示例:

<map>
    <map_values></map_values>

    <grid>
        <grid_values></grid_values>

        <square>
            <values></values>
        </square>

        <square>
            <values></values>
        </square>

        <square>
            <values></values>
        </square>
    </grid>

    <grid>
        <grid_values></grid_values>

        <square>
            <values></values>
        </square>

        <square>
            <values></values>
        </square>

        <square>
            <values></values>
        </square>
    </grid>
</map>

目前我正在使用DOM尝试阅读此内容,但我不确定如何一次读取一个网格的方块部分。现在我正在使用以下内容:

NodeList squares = doc.getElementsByTagName("square");

但是它返回了两个网格中的所有方块。

我可以切换出DOM,我只需要建议切换到哪里以及在哪里找到一个好的教程。

5 个答案:

答案 0 :(得分:2)

您可以使用JAXB。为这些地图创建模型对象非常容易。

参见例如 http://www.mkyong.com/java/jaxb-hello-world-example/ 关于如何使用这个库。

答案 1 :(得分:2)

我建议使用 JAXB(Java Architecture for XML Binding),因为它易于使用,也可用于验证XSD(如果需要)。

Java Beans&lt; ----&gt; XML

以下是一个让您感受到它的示例:

来源:JAXB Tutorail Basic

@XmlRootElement(name = "book")
// If you want you can define the order in which the fields are written
// Optional
@XmlType(propOrder = { "author", "name", "publisher", "isbn" })
public class Book {

  private String name;
  private String author;
  private String publisher;
  private String isbn;

  // If you like the variable name, e.g. "name", you can easily change this
  // name for your XML-Output:
  @XmlElement(name = "title")
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  public String getPublisher() {
    return publisher;
  }

  public void setPublisher(String publisher) {
    this.publisher = publisher;
  }

  public String getIsbn() {
    return isbn;
  }

  public void setIsbn(String isbn) {
    this.isbn = isbn;
  }

}

答案 2 :(得分:1)

你做这样的事情:

NodeList grids = doc.getElementsByTagName("grid");

然后迭代grids,并为每个人调用getElementsByTagName("square")

这可以解决您的问题:

NodeList grids = doc.getElementsByTagName("grid");
for (int i=0; i < grids.getLength(); ++i) {
    Element grid = (Element) grids.item(i);
    NodeList squares = grid.getElementsByTagName("square");
    ...
}

答案 3 :(得分:1)

1)我个人的偏好是DOM。 SAX通常是我的第二选择(如果性能成为问题)。

2)有很多(很多,很多!)关于Java和XML的好教程,包括:

3)以下是关于如何使用Java和XPath获取您正在寻找的节点的一个很好的讨论:

答案 4 :(得分:0)

您可能希望首先找到网格:

  NodeList grids = doc.getElementsByTagName("grid");

然后,要获取第一个square节点的第一个grid,请尝试:

  Node gridNode = grids.item(0);
  Node squareNode = gridNode.getChildNodes().item(2); //as it is second child node

*的 _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____

但是如果您可能想要使用某些XML框架,那就更好了,例如XStream具有非常简单的API,可将XML转换为JAVA个对象。使用它,您可能希望在JAVA中转换两个XML文件并使用JAVA比较。

简单的步骤是:

  1. 定义简单Java对象(PO​​JO),例如MyXMLObj映射Java属性中的XML属性。
  2. 将您的XML转换为Java:

    XStream xstream = new XStream();
    //or
    XStream xstream = new XStream(new DomDriver());
    //or
    //XStream xstream = new XStream(new StaxDriver());
    
     MyXMLObj myXMLObj= (MyXMLObj)xstream.fromXML(xml1);
    
  3. 只需遍历您的java对象并获​​取所需的属性值:

    myXMLObj.getGrids().get(0).getSquare();//returns square from first gird node