Получить элемент с помощью Jdom / XPath и " - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над приложением, которое имеет следующие типы XML-файлов (document.xml):

<root>
    <subRoot myAttribute="CN=Ok">
        Ok
    </subRoot>
    <subRoot myAttribute="CN=&quot;Problem&quot;">
        Problem
    </subRoot>    
</root>

Мне нужно получить Element с использованием выражений XPath.Я не могу получить второй элемент, который мне нужно выбрать, используя значение myAttribute.Это связано с символом &quot; ...

Вот тестовый класс.Второе утверждение выдает AssertionError, поскольку объект имеет значение null.

import static org.junit.Assert.assertNotNull;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

import org.apache.commons.io.IOUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import org.junit.Test;

public class XPathTest {

    @Test
    public void quotesXpath() throws JDOMException, IOException {
        Document document = getDocumentFromContent(getClasspathResource("document.xml"));

        String okXPath = "/root/subRoot[@myAttribute=\"CN=Ok\"]";
        assertNotNull(getElement(document, okXPath)); // Ok ...

        String problemXPath = "/root/subRoot[@myAttribute=\"CN=&quot;Problem&quot;\"]";
        assertNotNull(getElement(document, problemXPath)); // Why null ?
    }

    public String getClasspathResource(String filePath) throws IOException {
        try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath)) {
            return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
        }
    }

    public static Document getDocumentFromContent(String content) throws IOException, JDOMException {
        try (InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) {
            SAXBuilder builder = new SAXBuilder();
            return builder.build(is);
        }
    }

    public Element getElement(Document document, String xpathExpression) throws JDOMException {
        XPath xpath = XPath.newInstance(xpathExpression);
        return (Element) xpath.selectSingleNode(document);
    }
}

Приложение использует Jdom 1.1.3

<dependency>
   <groupId>org.jdom</groupId>
   <artifactId>jdom</artifactId>
   <version>1.1.3</version>
</dependency>

Как я могу изменить свое выражение xpath, чтобы второеэлемент возвращается?Возможно ли это с этой версией Jdom?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 23 ноября 2018

Попробуйте это выражение:

    String problemXPath = "/root/subRoot[@myAttribute='CN=\"Problem\"']";

Во-первых, когда документ анализируется, объект &quot; заменяется символом ", поэтому его следует использовать непосредственно в выражении XPath.

Во-вторых, в XPath вы можете использовать одинарные или двойные кавычки для строковых констант, что удобно, если у вас есть строки, содержащие кавычки.

...