[英]How to find Self-Closing Tags with org.w3c.dom
有誰知道,如何找到 XML 文件的自閉標簽?
我能夠獲取特定類型的所有元素,但我無法找到自閉合的元素,而且我需要找到沒有屬性的元素。
var dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
var db = dbf.newDocumentBuilder();
var urlToFile = MyClass.class.getClassLoader().getResource("file.xml");
var file = Paths.get(urlToFile .toURI()).toFile();
var doc = db.parse(file);
doc.getDocumentElement().normalize();
var list = doc.getElementsByTagName("myTag");
for (int i = 0; i < list.getLength(); i++) {
var node = list.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
var bits = node.getChildNodes();
for (int j = 0; j < bits.getLength(); j++) {
if (bits.item(j).hasAttributes()) {
// var parrentAttrName = bits.item(j).getNodeName();
// getValueFromAttribute is my private method
var nameAttrValue = getValueFromAttribute(bits, j, "name");
var stateAttrValue = getValueFromAttribute(bits, j, "state");
bits.addElementToList(new MyBit(nameAttrValue, stateAttrValue));
}
if(!bit.item(j).hasAttributes()) {
// not working
System.out.println(bits.item(j));
}
}
}
}
我的 XML 文件有兩種類型的myTag
標簽:
<myTag><someElementHere /></myTag>
<myTag/>
有沒有一種機制可以找到這種元素? 一個可能的事情是,匹配自關閉標簽的正則表達式,但我在考慮其他一些可能的解決方案。
一旦文檔被解析,內容被加載到 DOM 中,就沒有標簽,只有節點。 您可以判斷一個元素節點是空的(通過詢問它是否有任何子節點),但您無法判斷該空元素最初是寫成<myTag/>
還是寫成<myTag></myTag>
。 這是作者的選擇,對收件人應該沒有影響。
您的問題表明您對詞法 XML(標簽和尖括號)與 DOM 表示的 XML 的樹 model 之間的區別感到非常困惑。
自閉標簽沒有子標簽,但空標簽也沒有。 也就是說,XPath 可用於查找沒有子元素或具有屬性的元素
鑒於
<?xml version="1.0" encoding="UTF-8"?>
<root>
<test/>
<test a="a"/>
<empty></empty>
<test>
<a>a</a>
</test>
<test>text</test>
<deep>
<some b="b" />
</deep>
</root>
查找沒有孩子的元素//*[count(./descendant::*) = 0 and count(./text()) = 0]
xmllint --shell test.xml
</ cat //*[count(./descendant::*) = 0 and count(./text()) = 0]
<test/>
-------
<test a="a"/>
-------
<empty/>
-------
<some b="b"/>
查找屬性為 xpath //*[count(./@*)> 0]
的元素
/ > cat //*[count(./@*)> 0]
-------
<test a="a"/>
-------
<some b="b"/>
注意:XPath 與語言無關,因此它應該適用於 java。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.