【问题标题】:Selecting a node that follows a given node选择跟随给定节点的节点
【发布时间】:2015-04-21 16:36:04
【问题描述】:

我必须使用 DOM 操作和 XPath 从格式如下的 iTunes 库 XML 文件中提取数据:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Tracks</key>
    <dict>
        <dict>
            <key>Track ID</key><integer>203</integer>
            <key>Name</key><string>Winter</string>
            <key>Artist</key><string>Daughter</string>
            <!-- etc -->
            <key>Play Count</key><integer>2</integer>
            <key>Skip Count</key><integer>1</integer>
            <key>Track Type</key><string>File</string>
        </dict>
        <dict>
            Another set of track data, etc...
        </dict>
    </dict>
</dict>
</plist>

我需要能够从该文件中提取和存储数据位并将它们存储在数组中。 例如,我想将所有曲目名称存储在一个数组中,将所有艺术家姓名存储在另一个数组中,但我不想存储其他值,例如播放/跳过计数。

我知道 XPath 的工作方式是这样的(如下面的 switch 语句所示),可以到达正确的位置,但是键并不总是在相同的位置。我正在有效地寻找一种基于前一个值的值执行后向断言的方法。

XPathExpression expr = xPath.compile("/plist/dict/dict/dict");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
StringBuilder outputString = new StringBuilder();

for (int i = 1; i <= nl.getLength(); i++) {
    for (int j = 0; j < 6; j++) {
        String label = "";
        switch (j) {
            case 0: expr = xPath.compile("/plist/dict/dict/dict["+i+"]/key[2]/text()");
                    //Append this value to TRACKNAME array with expr.evaluate
                    break;
            case 1: expr = xPath.compile("/plist/dict/dict/dict["+i+"]/key[3]/text()");
                    //Append this value to ARTIST array with expr.evaluate
                    break;
            case 2: /* ... */
        }
    }
}

【问题讨论】:

    标签: java xml dom xpath


    【解决方案1】:

    如果你的xml代码是正确的,你可以试试这个解决方案:

    /plist//dict["+i+"]/key[contains(text(),'Track ID')]/following-sibling::*[1]
    

    它为关键元素创建条件 - 如果包含文本(例如“Track ID”),则查找第一个同级元素 - 在本例中为值为 203 的整数。

    在following-sibling 之后使用星号可以让您捕获每个不感兴趣的第一个元素,如果它是整数或字符串元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多