【发布时间】: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: /* ... */
}
}
}
【问题讨论】: