使用 Jdom / XPath 和 " 检索元素
Retrieve element with Jdom / XPath and "
我正在开发具有这些 xml 文件 (document.xml
) 的应用程序:
<root>
<subRoot myAttribute="CN=Ok">
Ok
</subRoot>
<subRoot myAttribute="CN="Problem"">
Problem
</subRoot>
</root>
我需要使用 XPath 表达式检索 Element
。我无法检索第二个元素,我需要使用 myAttribute
的值 select。这是由于 "
字符 ...
这是一个测试class。第二个断言抛出一个 AssertionError 因为对象是空的。
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="Problem"\"]";
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 可以吗?
感谢您的帮助!
试试这个表达式:
String problemXPath = "/root/subRoot[@myAttribute='CN=\"Problem\"']";
首先,在解析文档时,实体 "
被替换为 "
字符,因此应直接在 XPath 表达式中使用。
其次,在 XPath 中,您可以对字符串常量使用单引号或双引号,如果您的字符串包含引号,这将很方便。
我正在开发具有这些 xml 文件 (document.xml
) 的应用程序:
<root>
<subRoot myAttribute="CN=Ok">
Ok
</subRoot>
<subRoot myAttribute="CN="Problem"">
Problem
</subRoot>
</root>
我需要使用 XPath 表达式检索 Element
。我无法检索第二个元素,我需要使用 myAttribute
的值 select。这是由于 "
字符 ...
这是一个测试class。第二个断言抛出一个 AssertionError 因为对象是空的。
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="Problem"\"]";
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 可以吗?
感谢您的帮助!
试试这个表达式:
String problemXPath = "/root/subRoot[@myAttribute='CN=\"Problem\"']";
首先,在解析文档时,实体 "
被替换为 "
字符,因此应直接在 XPath 表达式中使用。
其次,在 XPath 中,您可以对字符串常量使用单引号或双引号,如果您的字符串包含引号,这将很方便。