Как перебрать XML в Java с тегами с одинаковыми именами - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь перебрать этот xml-файл в Java, используя DOM-библиотеку (должен его использовать), и до сих пор мне удавалось получить определенные элементы, просто запросив его таким образом:

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 / Lights, но, похоже, я не нашел способа доступа к подтегу, который бы не зависел от того, чтобы я вручную набирал точное количество строк.

Мне нужно выполнить итерации по всем поверхностным / световым меткам, поскольку, получив всю информацию, я создаю новую поверхность / источник света в случае сбора данных для нее.

<?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>

1 Ответ

1 голос
/ 03 июня 2019

document.getElementsByTagName(tagname) выполняет поиск всех элементов, содержащихся в документе.

element.getElementsByTagName(name) ищет все элементы-потомки, т. Е. Только поддерево данного элемента.

Так что вы можете сделать это так:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...