我正在尝试解析以下 XML 数据。我只需要 d:MessageId 和 d:SerialNumber。
<feed xmlns="http://www.w3.org/2005/Atom" ...>
<script id="tinyhippos-injected"/>
<id>...</id>
<title type="text">ViewError</title>
<updated>2015-08-25T01:41:55Z</updated>
<author>...</author>
<link href="EDI_ViewError" rel="self" title="EDI_ViewError"/>
<entry>...</entry>
<entry>...</entry>
<entry>
<id>
serveraddress
</id>
<title type="text">ViewError('ABCDEFG')</title>
<updated>2015-08-25T01:41:55Z</updated>
<category term="ViewError" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="ViewError('GSTU7417706')" rel="edit" title="ViewError"/>
<content type="application/xml">
<m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
<d:MessageId>msgId_1</d:MessageId>
<d:SerialNumber>sernr_1</d:SerialNumber>
</m:properties>
</content>
</entry>
</feed>
我怎样才能做到这一点?我的安卓代码如下。
HTTP 部分:
HttpClient httpclient = new DefaultHttpClient();
String user = "username";
String pwd = "pass";
HttpGet httpGet = new HttpGet("properhttplink");
httpGet.addHeader("Auth Header");
HttpResponse response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
解析器部分:
XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myParser = xmlFactoryObject.newPullParser();
myParser.setInput(is, null);
String dee;
int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT)
{
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.TEXT:
break;
case XmlPullParser.END_TAG:
if(name.equals("d")){
dee = myParser.getAttributeValue(null,"value");
}
break;
}
event = myParser.next();
}
请注意 myParser.getEventType()
总是返回 "0"
而 myParser.getName()
总是返回 "null "
.
最佳答案
首先标签的名称是MessageId
,不是d
。 d
是标签的命名空间;命名空间用于区分名称相同但含义不同的标签。如果您的文档中没有 MessageId
的其他用途(即您永远不会在其他地方看到它与任何其他 namespace 一起使用),那么您可以有效地忽略它。
if ("MessageId".equals(parser.getName())) {
或者,如果命名空间真的很重要
if ("d".equals(parser.getNamespace()) && "MessageId".equals(parser.getName())) {
其次:您的代码使用了getAttributeValue()
,但您尝试读取的内容是标签的文本内容,而不是标签的属性。您应该使用 getText()
(如果当前事件是 TEXT
)或 nextText()
(如果当前事件是 START_TAG
)。这导致我们...
第三:您无法阅读 END_TAG
事件中的文本。
我将从这里开始编写您的解析器代码:
XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser parser = xmlFactoryObject.newPullParser();
parser.setInput(is, null);
String dee;
int event;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_TAG:
if ("MessageId".equals(parser.getName()) {
dee = parser.nextText();
}
break;
// TODO: other event types, if you care about them
} // end switch
} // end while
关于android - xmlns : android parsing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32195053/