使用Java读取XML

使用Java读取XML,java,xml,Java,Xml,我已经看了几个例子,但它们似乎都使用了比我要读的更简单的XML文件 下面是我试图阅读的布局示例: <map> <map_values></map_values> <grid> <grid_values></grid_values> <square> <values></values> </sq

我已经看了几个例子,但它们似乎都使用了比我要读的更简单的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,我只需要一个关于切换到什么以及在哪里可以找到好教程的建议。

您可以这样做吗:

nodelistgrids=doc.getElementsByTagName(“网格”)

然后遍历
网格
,对于每个网格,调用
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");
    ...
}
nodelistgrids=doc.getElementsByTagName(“网格”);
对于(int i=0;i
你这样做怎么样:

nodelistgrids=doc.getElementsByTagName(“网格”)

然后遍历
网格
,对于每个网格,调用
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");
    ...
}
nodelistgrids=doc.getElementsByTagName(“网格”);
对于(int i=0;i
您可以使用JAXB来实现这一点。为这些贴图创建模型对象非常容易

例如,见
关于如何使用这个库。

您可以使用JAXB来实现这一点。为这些贴图创建模型对象非常容易

例如,见 关于如何使用这个库。

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

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

3) 下面是一个关于如何使用Java和XPath获取您要查找的节点的很好的讨论:

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

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

    3) 下面是一个关于如何使用Java和XPath获取您要查找的节点的很好的讨论:


    您可能希望首先找到网格,如下所示:

      NodeList grids = doc.getElementsByTagName("grid");
    
    然后,要获取第一个
    网格
    节点的第一个
    正方形
    ,请尝试:

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

    但是,如果您可能想使用一些XML框架,例如使用非常简单的API将
    XML
    转换为
    JAVA
    对象,则更好。使用此选项,您可能希望在JAVA中转换这两个XML文件并使用JAVA比较

    简单的步骤是:

  • 定义简单Java对象(POJO),例如
    MyXMLObj
    ,以映射Java属性中的XML属性
  • 将Java中的XML转换为:

    XStream xstream = new XStream();
    //or
    XStream xstream = new XStream(new DomDriver());
    //or
    //XStream xstream = new XStream(new StaxDriver());
    
     MyXMLObj myXMLObj= (MyXMLObj)xstream.fromXML(xml1);
    
  • 只需遍历java对象并获得所需的属性值,如下所示:

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

  • 您可能希望首先找到轴网,如下所示:

      NodeList grids = doc.getElementsByTagName("grid");
    
    然后,要获取第一个
    网格
    节点的第一个
    正方形
    ,请尝试:

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

    但是,如果您可能想使用一些XML框架,例如使用非常简单的API将
    XML
    转换为
    JAVA
    对象,则更好。使用此选项,您可能希望在JAVA中转换这两个XML文件并使用JAVA比较

    简单的步骤是:

  • 定义简单Java对象(POJO),例如
    MyXMLObj
    ,以映射Java属性中的XML属性
  • 将Java中的XML转换为:

    XStream xstream = new XStream();
    //or
    XStream xstream = new XStream(new DomDriver());
    //or
    //XStream xstream = new XStream(new StaxDriver());
    
     MyXMLObj myXMLObj= (MyXMLObj)xstream.fromXML(xml1);
    
  • 只需遍历java对象并获得所需的属性值,如下所示:

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

  • 我建议使用JAXB(用于XML绑定的Java体系结构),因为它易于使用,也可以用于针对XSD进行验证(如果需要)

    javabeansxml

    下面是一个示例,让您体验一下:

    资料来源:


    我建议使用JAXB(用于XML绑定的Java体系结构),因为它易于使用,也可以用于针对XSD进行验证(如果需要)

    javabeansxml

    下面是一个示例,让您体验一下:

    资料来源:


    我可以在网格上迭代,但其中的每个项目本身都有一个节点,并且不能在节点上调用getElementsByTagName每个项目都有一个
    节点
    实例。但是,
    元素
    扩展了
    节点
    。您可以将
    网格。项(i)
    投射到
    元素
    Element
    有一个
    getElementsByTagName
    方法。更新了我的答案,以演示如何进行。我可以在网格上迭代,但其中的每个项本身都有一个节点,并且不能在节点上调用getElementsByTagName每个项都有一个
    节点
    实例。但是,
    元素
    扩展了
    节点
    。您可以将
    网格。项(i)
    投射到
    元素
    Element
    有一个
    getElementsByTagName
    方法。更新了我的答案,以演示如何更新。mkyong教程有我上面提到的相同问题。虽然对于更简单的XML来说很好,但它并没有显示如何克服我遇到的问题。这就是XPath的用途!请阅读Developerworks链接。不要放弃DOM。IMHOThe mkyong教程有我上面提到的相同问题。虽然对于更简单的XML来说很好,但它并没有显示如何克服我遇到的问题。这就是XPath的用途!请阅读Developerworks链接。不要放弃DOM。IMHO@Dr.Cyanide:我也用节点遍历更新了我的答案。@Dr.氰化物:我也用节点遍历更新了我的答案。我看了一下,我在做什么JAXB可能是最好的。我现在必须做另一个项目,我不确定我是否应该把这个问题标记为已回答,直到我能回到我的工作