gpt4 book ai didi

java - 如何解析某些标签中带有冒号的 XML?

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:36 25 4
gpt4 key购买 nike

我一直在阅读一些关于 Android 中 XmlPullParser 的教程,了解如何解析 XML 数据。更具体地说,我使用 https://gdata.youtube.com/feeds/api/standardfeeds/top_rated 中的 XML

在这里,我简化了此提要中的条目的一部分(我希望不改变结构):

<entry>
<id>http://gdata.youtube.com/feeds/api/videos/abc45678qwe</id>
[...]
<title type='text'>THE TITLE</title>
[...]
<link rel='alternate' type='text/html' href='https://www.youtube.com/watch?v=abc45678qwe&amp;feature=youtube_gdata'/>
[...]
<media:group>
[...]
<media:title type='plain'>THE TITLE</media:title>
<yt:duration seconds='300'/>
[...]
<yt:videoid>abc45678qwe</yt:videoid>
</media:group>
<gd:rating average='1' max='5' min='1' numRaters='1' rel='http://schemas.google.com/g/2005#overall'/>
<yt:statistics favoriteCount='0' viewCount='11111111'/>
<yt:rating numDislikes='111' numLikes='111'/>
</entry>

我成功获取了标题和链接:

private String[] readEntry(XmlPullParser parser)
throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, null, "entry");
String title = null;
String link = null;

while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}

String name = parser.getName();
String rel = parser.getAttributeValue(null, "rel");

if (name.equalsIgnoreCase("title")) {
title = readTitle(parser);
} else if (name.equalsIgnoreCase("link")
&& rel.equals("alternate")) {
link = readLink(parser);
} else {
skip(parser);
}
}
return new String[] { title, link };
}

private String readLink(XmlPullParser parser)
throws XmlPullParserException, IOException {
String link = "";
parser.require(XmlPullParser.START_TAG, null, "link");

link = parser.getAttributeValue(null, "href");
parser.nextTag();

parser.require(XmlPullParser.END_TAG, null, "link");

return link;
}

private String readTitle(XmlPullParser parser)
throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, null, "title");
String title = readText(parser);
parser.require(XmlPullParser.END_TAG, null, "title");
return title;
}

但无论我尝试什么,我都无法从 <yt:duration seconds='300'/> 获取以秒为单位的持续时间。

显然不能使用与上述方法类似的方法来访问它,因为应该需要处理namespaces,但我不确定。因为我对此有点迷失,所以非常感谢任何建议。谢谢。

====

编辑:我正在添加我尝试输入标签 yt:duration 的内容。

我在 skip(parser); 之前添加了其他检查。即:

} else if (name.equalsIgnoreCase("yt:")) {
Utils.logger("i", "entering yt:", TAG);
readDuration(parser)
}

我用 "yt:""yt" 更改了 "yt:duration ,但没​​有结果。
还带有

String namespace = parser.getNamespace();

并用 name.equalsIgnoreCase... 更改 namespace.equalsIgnoreCase... 我没有收到日志条目,所以我什至没有办法尝试此操作:

private String readDuration(XmlPullParser parser)
throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, "yt", "duration");

String seconds = parser.getAttributeValue(null, "seconds");
parser.nextTag();

parser.require(XmlPullParser.END_TAG, "yt", "duration");

Utils.logger("i", "duration: " + seconds + " seconds", TAG);
return seconds;
}

“根据要求”进行了添加。我不确定它是否足够有用。

最佳答案

XmlPullParser 似乎能够感知命名空间,不同之处在于它必须显式设置。根据 XmlPullParseFactory#setNamespaceAware 的文档:

Specifies that the parser produced by this factory will provide support for XML namespaces. By default the value of this is set to false.

您可能想尝试该选项。

另外,正如评论中提到的,我尝试用 DOM 零问题地遍历你的 xml,下面是打印所有持续时间值的源代码(只是为了让你知道,这是作为 Java 程序且不在 ADT 内):

public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {
InputStream path = new URL(
"https://gdata.youtube.com/feeds/api/standardfeeds/top_rated")
.openStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(path);
traverse(document.getDocumentElement());

}

public static void traverse(Node node) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node currentNode = list.item(i);
traverse(currentNode);

}

if (node.getNodeName().equals("yt:duration")) {
Element durationElement = (Element) node;
System.out.println(durationElement.getAttribute("seconds"));
}

}

我得到的输出:

56
361
225
265
219
220
259
267
376
205
127
308
249
17
162
220
183
298
172
267
204
209

我总是更喜欢使用 DOM 进行递归(如上所述),因为它简化了完整的遍历,从而也提供了灵 active 。

如果你想了解更多如何将这些元素组合在一起,可以引用我的帖子here也是如此。

关于java - 如何解析某些标签中带有冒号的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785054/

25 4 0