Получить XML Узел с идентификатором или именем - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующий xml файл

<Capabilities>
    <Capability id="test" name="test">
       <File Path="bin/test.exe" />
       <File Path="bin/abc.dll" />
       <File Path="bin/xyz.dll" />
       <File Path="LICENSE" />
       <File Path="third-party-programs.txt" />
    </Capability>
    <Capability id="test1" name="test1">
       <File Path="bin/test1.exe" />
       <File Path="LICENSE" />
       <File Path="third-party-programs.txt" />
    </Capability>
<Capabilities>

Я хочу получить узел с id = "test1", но без зацикливания всех узлов. Я попытался использовать следующее в java

try {
        documentBuilder = documentBuilderFactory.newDocumentBuilder();
        document = documentBuilder.parse(xmlFile);
    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
    // get the node with id="test1"
    Node capabilityNode = document.getElementById("test1");

Из приведенного выше кода я получаю нулевое значение. В документации getElementbyId сказано, что атрибут id должен иметь идентификатор типа. Как я могу убедиться, что идентификатор имеет тип ID или есть способ, которым я могу получить узел напрямую без зацикливания по имени?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Вы можете написать пользовательский getElementById, используя XPath. Эта функция вернет первый элемент с атрибутом id со значением idValue.

public static Node getElementById(Document document, String idValue) throws XPathExpressionException {
    XPath xpath = XPathFactory.newInstance().newXPath();
    return (Node) xpath.evaluate(String.format("//*[@id='%s']", idValue), document, XPathConstants.NODE);
}
0 голосов
/ 04 марта 2020

Хорошо, так что прежде всего вам не хватает закрытия sla sh в последнем теге. Во-вторых, если вы хотите получить атрибуты какого-либо элемента, вы можете использовать его с типом (Element), который извлекает атрибуты из узла, который вы хотите наблюдать. это решение будет l oop только дважды и не через все теги

    NodeList nodeList = doc.getElementsByTagName("Capability");
    String nodeAttribute ="";
    for(int i =0;i<nodeList.getLength();i++){
        nodeAttribute = ((Element) nodeList.item(i)).getAttribute("id");
        if(nodeAttribute.equals("test1"))
            break;
    }

    System.out.println("nodeAttribute:"+nodeAttribute+ " Node 
    Length:"+nodeList.getLength()); 
...