簡體   English   中英

如何使用 org.w3c.dom 查找自閉合標簽

[英]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標簽:

  1. 配對標簽,包含另一個嵌套的子元素<myTag><someElementHere /></myTag>
  2. 自關閉標簽,指定一些其他行為<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM