有誰知道,如何找到 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/>
有沒有一種機制,可以找到這種元素?一種可能的事情是,匹配自閉合標簽的正則運算式,但我正在考慮其他一些可能的解決方案。
任何合理的答案將不勝感激。
提前致謝。
uj5u.com熱心網友回復:
一旦檔案被決議,內容被加載到 DOM 中,就沒有標簽,只有節點。您可以判斷一個元素節點是空的(通過詢問它是否有任何子節點),但您無法判斷該空元素最初是寫成 as<myTag/>還是 as <myTag></myTag>。那是作者的選擇,對收件人沒有影響。
您的問題表明您對詞法 XML(標簽和尖括號)與 DOM 表示的 XML 的樹模型之間的區別感到非常困惑。
uj5u.com熱心網友回復:
自閉合標簽沒有子標簽,但空標簽也是如此。也就是說,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 中作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437611.html
