如何使用具有相同名称的标签遍历Java中的XML [英] How do I Iterate over an XML in Java, with tags, that have the same name

查看:38
本文介绍了如何使用具有相同名称的标签遍历Java中的XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用DOM-Library(必须使用它)遍历Java中的这个xml文件,到目前为止,我已经能够通过直接以这种方式直接请求来获取某些元素:

I'm trying to iterate over this xml-file in Java using the DOM-Library(have to use it), and so far I've been able to get certain elements just by directly asking for it this way:

NodeList pList = document.getElementsByTagName("position");
Node pNode = pList.item(0);
Element pElement = (Element) pNode;

double xp = Double.parseDouble(pElement.getAttribute("x"));
double yp = Double.parseDouble(pElement.getAttribute("y"));
double zp = Double.parseDouble(pElement.getAttribute("z"));

,但是一旦我想要访问元素,它本身可能具有多个标签,这将不再起作用.例如,如果我要添加更多的Sphere,那么会有更多标记为Sphere的标签.

but this doesn't work anymore, once I want to access elements, that might have multiple tags in itself. for example, if I were to add more Spheres, there would be more tags labeled Sphere.

我尝试遍历Sphere/Lights标记,但是我似乎没有找到访问子标记的方法,这不依赖于我手动输入确切的行数.

I've tried to loop through the Sphere/Lights Tag, but I don't seem to find a way, to access the sub-tag, that doesn't rely on me manually typing in the exact number of rows.

我需要遍历所有表面/灯光标签,因为一旦获得所有信息,便会在收集数据的同时创建一个新的表面/灯光.

I need to iterate over all surface/light-tags, since once I have all the information I create a new surface/light in the instance of collecting the data for it.

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE scene SYSTEM "scene.dtd">

<scene output_file="example1.png">
    <background_color r="0.0" g="0.0" b="0.0"/>
    <camera>
        <position x="0.0" y="0.0" z="1.0"/>
        <lookat x="0.0" y="0.0" z="-2.5"/>
        <up x="0.0" y="1.0" z="0.0"/>
        <horizontal_fov angle="45"/>
        <resolution horizontal="512" vertical="512"/>
        <max_bounces n="8"/>
    </camera>
    <lights>
        <ambient_light>
            <color r="1.0" g="1.0" b="1.0"/>
        </ambient_light>
    </lights>
    <surfaces>
        <sphere radius="1.0">
            <position x="-2.1" y="0.0" z="-3.0"/>
            <material_solid>
                <color r="0.17" g="0.18" b="0.50"/>
                <phong ka="0.3" kd="0.9" ks="1.0" exponent="200"/>
                <reflectance r="0.0"/>
                <transmittance t="0.0"/>
                <refraction iof="2.3"/>
            </material_solid>
        </sphere>
        <sphere radius="1.0">
            <position x="0.0" y="0.0" z="-3.0"/>
            <material_solid>
                <color r="0.5" g="0.17" b="0.18"/>
                <phong ka="0.3" kd="0.9" ks="1.0" exponent="200"/>
                <reflectance r="0.0"/>
                <transmittance t="0.0"/>
                <refraction iof="2.3"/>
            </material_solid>
        </sphere>
        <sphere radius="1.0">
            <position x="2.1" y="0.0" z="-3.0"/>
            <material_solid>
                <color r="0.18" g="0.50" b="0.17"/>
                <phong ka="0.3" kd="0.9" ks="1.0" exponent="200"/>
                <reflectance r="0.0"/>
                <transmittance t="0.0"/>
                <refraction iof="2.3"/>
            </material_solid>
        </sphere>
    </surfaces>
</scene>

推荐答案

document.getElementsByTagName(tagname) searches all the Elements contained in the document.

element.getElementsByTagName(name) searches all descendant Elements, i.e. only the sub-tree of the given element.

因此您可以这样做:

NodeList sphereList = document.getElementsByTagName("sphere");
for (int i = 0; i < sphereList.getLength(); i++) {
    Element sphereElem = (Element) sphereList.item(i);
    Element positionElem = (Element) sphereElem.getElementsByTagName("position").item(0);

    double radius = Double.parseDouble(sphereElem.getAttribute("radius"));
    double x = Double.parseDouble(positionElem.getAttribute("x"));
    double y = Double.parseDouble(positionElem.getAttribute("y"));
    double z = Double.parseDouble(positionElem.getAttribute("z"));

    // use values here
}

这篇关于如何使用具有相同名称的标签遍历Java中的XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆