- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有这样的东西:
<info>
<collectorKey id="key"/>
<credentials user="user" password="password"/>
<Infos>
<dummyInfo>
<infoSource temp="N/A">
<tags>
<tag id="1" value="example"/>
<tag id="2" value="example"/>
<tag id="3" value="example"/>
<tag id="4" value="example"/>
<tag id="5" value="example"/>
<tag id="6" value="example"/>
<tag id="7" value="example"/>
</tags>
</infoSource>
</dummyInfo>
</Infos>
<Infos>
<dummyInfo>
<infoSource temp="N/A">
<tags>
<tag id="1" value="example"/>
<tag id="2" value="example"/>
<tag id="3" value="example"/>
<tag id="4" value="example"/>
<tag id="5" value="example"/>
<tag id="6" value="example"/>
<tag id="7" value="example"/>
</tags>
</infoSource>
</dummyInfo>
</Infos>
</info>
我想获取 ID 为 2 的每个标签属性并获取该标签的值。现在我有一些冗长的代码来完成它,但它看起来不太实用。如果可能的话我想将其转换为使用 xpath 我想知道这是如何完成的。我将一些框架代码放在一起,但它并没有将我的标签值设置为 2。我认为需要添加一些循环以及一些更改。
类似于:
try {
ClassLoader classLoader = getClass().getClassLoader();
File configProdXML = new File(classLoader.getResource("files/config-prod.xml").getFile());
//parse it using a docbuilder
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = null;
dBuilder = dbFactory.newDocumentBuilder();
Document parsedConfig = dBuilder.parse(configProdXML);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/tags/tags/@id=2/text()");
System.out.println(expr.toString());
旁注。 xpath 是最实用的吗?
最佳答案
是的,XPath 非常适合这样做:
XPathExpression expr = xpath.compile("//tags/tag[@id=2]/@example");
一些解释:
//tags
中的两个斜杠表示全部<tags>
文档中任意级别、任意位置的元素。tag[@id=2]
意味着 <tag>
元素,但带有一个谓词来限制哪些元素符合条件。通常,没有必要直接调用 XPath.compile,除非您计划将相同的 XPath 应用到许多不同的源。您只需调用evaluate
即可直接方法:
NodeList values = (NodeList)
xpath.evaluate("//tags/tag[@id=2]/@example", parsedConfig,
XPathConstants.NODESET);
警告:切勿调用 URL.getFile()。它不会将 URL 转换为有效的文件名 - 它只是返回主机和端口之后的 URL 部分,其中可能包含许多不允许出现在 URL 中的字符的百分比转义符。另外,Class.getResource 或 ClassLoader.getResource 返回的 URL 根本不保证指向文件;特别是,如果您尝试从 .jar 文件运行,您将不会得到 file:
网址。
幸运的是,您不需要文件。您甚至不需要解析文档。您可以直接将 InputStream 传递到您的 XPath:
try (InputStream config = getClass().getResourceAsStream("/files/config-prod.xml")) {
NodeList values = (NodeList)
xpath.evaluate("//tags/tag[@id=2]/@example", new InputSource(config),
XPathConstants.NODESET);
int count = values.getLength();
for (int i = 0; i < count; i++) {
String value = values.item(i).getNodeValue();
System.out.println("Found value \"" + value + "\"");
}
}
关于java - 使用 xpath 读取多个 XML 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47898057/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!