如何在解析 XML 时使用 Android 中的 XmlPullParser 正确处理命名空间?
How do I properly handle namespaces using XmlPullParser in Android, while parsing XML?
我会尽量简短。我正在尝试在我的 Android 应用程序中使用 XmlPullParser 处理 KML (XML) 文件。我已经让它工作得很好,但我对名称空间感到厌烦。
我这样启动解析器:
public void parse(FileInputStream in) throws XmlPullParserException, IOException {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(in, null);
parser.nextTag();
readKML(parser);
} finally {
in.close();
}
}
接下来,程序逐步完成我设置的各种标签检查,并正确地 returns 所有值,直到它到达 XML 使用命名空间 (xal) 的部分:
<Folder>
<name>Family & Friends</name>
<description>Locations of family members and friends.</description>
<Placemark>
<name>Fred and Marthas House</name>
<description></description>
<Point>
<coordinates>-55.55559,55.55555,120.0</coordinates>
</Point>
<xal:AddressDetails>
<xal:Country>
<xal:CountryName>United States</xal:CountryName>
<xal:CountryNameCode>US</xal:CountryNameCode>
<xal:AdministrativeArea>
<xal:AdministrativeAreaName>Michigan</xal:AdministrativeAreaName>
<xal:Locality>
<xal:LocalityName>Lawton</xal:LocalityName>
<xal:Thoroughfare>
<xal:ThoroughfareNumber></xal:ThoroughfareNumber>
<xal:ThoroughfareName>45th Street</xal:ThoroughfareName>
</xal:Thoroughfare>
<xal:PostalCode>
<xal:PostalCodeNumber></xal:PostalCodeNumber>
</xal:PostalCode>
</xal:Locality>
</xal:AdministrativeArea>
</xal:Country>
</xal:AddressDetails>
我这样处理每个 XML 值:
// Processes title tags in the feed.
private String readCountryNameCode(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, NS, G.KML.COUNTRY_NAME_CODE);
String countryCode = readText(parser);
Log.d(TAG, "Found CountryNameCode value under Country tag");
parser.require(XmlPullParser.END_TAG, NS, G.KML.COUNTRY_NAME_CODE);
return countryCode;
}
一旦到达 xml 的命名空间部分,它就会开始生气。堆栈跟踪显示:
2018-12-24 12:59:43.026 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}CountryNameCode (position:END_TAG </{urn:oasis:names:tc:ciq:xsdschema:xAL:2.0}xal:Country>@30:21 in java.io.InputStreamReader@9f81207)
2018-12-24 12:59:43.027 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: at org.kxml2.io.KXmlParser.require(KXmlParser.java:2067)
2018-12-24 12:59:43.027 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: at OBFUSCATED_PERSONAL_INFO.KML_Import_Pull.readCountryNameCode(KML_Import_Pull.java:470)
因此,接下来,我在读取值的 .require 语句中明确指定了命名空间:
// Processes title tags in the feed.
private String readCountryNameCode(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, "xal", G.KML.COUNTRY_NAME_CODE);
String countryCode = readText(parser);
Log.d(TAG, "Found CountryNameCode value under Country tag");
parser.require(XmlPullParser.END_TAG, "xal", G.KML.COUNTRY_NAME_CODE);
return countryCode;
}
堆栈跟踪略有变化,但或多或少仍然是相同的错误:
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {xal}CountryNameCode (position:START_TAG <{urn:oasis:names:tc:ciq:xsdschema:xAL:2.0}xal:CountryNameCode>@16:29 in java.io.InputStreamReader@eaf421)
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: at org.kxml2.io.KXmlParser.require(KXmlParser.java:2067)
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: at OBFUSCATED_PERSONAL_INFO.KML_Import_Pull.readCountryNameCode(KML_Import_Pull.java:470)
我唯一的其他想法是 XML 格式不正确,但其他应用程序处理得很好,至少前几个条目看起来格式正确。我手动检查了它们,并使用另一个应用程序进行了仔细检查。 编辑 我用的是在线的xml validator,检查文档的时候没有报错
我是否遗漏了任何设置 XmlPullParser 工厂为这个 xal 命名空间做准备的事情?
问题是程序性的,我有两个错误地 parser.nextTag 导致了错误的树。
我会尽量简短。我正在尝试在我的 Android 应用程序中使用 XmlPullParser 处理 KML (XML) 文件。我已经让它工作得很好,但我对名称空间感到厌烦。
我这样启动解析器:
public void parse(FileInputStream in) throws XmlPullParserException, IOException {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(in, null);
parser.nextTag();
readKML(parser);
} finally {
in.close();
}
}
接下来,程序逐步完成我设置的各种标签检查,并正确地 returns 所有值,直到它到达 XML 使用命名空间 (xal) 的部分:
<Folder>
<name>Family & Friends</name>
<description>Locations of family members and friends.</description>
<Placemark>
<name>Fred and Marthas House</name>
<description></description>
<Point>
<coordinates>-55.55559,55.55555,120.0</coordinates>
</Point>
<xal:AddressDetails>
<xal:Country>
<xal:CountryName>United States</xal:CountryName>
<xal:CountryNameCode>US</xal:CountryNameCode>
<xal:AdministrativeArea>
<xal:AdministrativeAreaName>Michigan</xal:AdministrativeAreaName>
<xal:Locality>
<xal:LocalityName>Lawton</xal:LocalityName>
<xal:Thoroughfare>
<xal:ThoroughfareNumber></xal:ThoroughfareNumber>
<xal:ThoroughfareName>45th Street</xal:ThoroughfareName>
</xal:Thoroughfare>
<xal:PostalCode>
<xal:PostalCodeNumber></xal:PostalCodeNumber>
</xal:PostalCode>
</xal:Locality>
</xal:AdministrativeArea>
</xal:Country>
</xal:AddressDetails>
我这样处理每个 XML 值:
// Processes title tags in the feed.
private String readCountryNameCode(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, NS, G.KML.COUNTRY_NAME_CODE);
String countryCode = readText(parser);
Log.d(TAG, "Found CountryNameCode value under Country tag");
parser.require(XmlPullParser.END_TAG, NS, G.KML.COUNTRY_NAME_CODE);
return countryCode;
}
一旦到达 xml 的命名空间部分,它就会开始生气。堆栈跟踪显示:
2018-12-24 12:59:43.026 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}CountryNameCode (position:END_TAG </{urn:oasis:names:tc:ciq:xsdschema:xAL:2.0}xal:Country>@30:21 in java.io.InputStreamReader@9f81207)
2018-12-24 12:59:43.027 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: at org.kxml2.io.KXmlParser.require(KXmlParser.java:2067)
2018-12-24 12:59:43.027 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: at OBFUSCATED_PERSONAL_INFO.KML_Import_Pull.readCountryNameCode(KML_Import_Pull.java:470)
因此,接下来,我在读取值的 .require 语句中明确指定了命名空间:
// Processes title tags in the feed.
private String readCountryNameCode(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, "xal", G.KML.COUNTRY_NAME_CODE);
String countryCode = readText(parser);
Log.d(TAG, "Found CountryNameCode value under Country tag");
parser.require(XmlPullParser.END_TAG, "xal", G.KML.COUNTRY_NAME_CODE);
return countryCode;
}
堆栈跟踪略有变化,但或多或少仍然是相同的错误:
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {xal}CountryNameCode (position:START_TAG <{urn:oasis:names:tc:ciq:xsdschema:xAL:2.0}xal:CountryNameCode>@16:29 in java.io.InputStreamReader@eaf421)
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: at org.kxml2.io.KXmlParser.require(KXmlParser.java:2067)
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: at OBFUSCATED_PERSONAL_INFO.KML_Import_Pull.readCountryNameCode(KML_Import_Pull.java:470)
我唯一的其他想法是 XML 格式不正确,但其他应用程序处理得很好,至少前几个条目看起来格式正确。我手动检查了它们,并使用另一个应用程序进行了仔细检查。 编辑 我用的是在线的xml validator,检查文档的时候没有报错
我是否遗漏了任何设置 XmlPullParser 工厂为这个 xal 命名空间做准备的事情?
问题是程序性的,我有两个错误地 parser.nextTag 导致了错误的树。