2011-11-09 75 views
0

我想分析其启动一个GPX(XML)文档如下:的Android解析XML错误 - 根元素名称不匹配

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" creator="Ian"> 

当解析我得到follwoing错误:

android.sax.BadXmlException: Line 1: Root element name does not match. Expected: 'gpx', Got: 'http://www.topografix.com/GPX/1/1:gpx' 

但是,如果我然后删除xmlns="http://www.topografix.com/GPX/1/1"属性 - 它完美解析。

我使用解析的代码是android.util.Xml.parse(is,Xml.Encoding.UTF_8,gpx.getContentHandler());

有谁知道为什么这个属性cauing解析错误?

任何帮助非常感谢! Ian

回答

1

当您创建rootElement的,你有机会到指定命名空间...

final RootElement rootElement = new RootElement("http://www.topografix.com/GPX/1/1", "gpx");

0

这是不是有效的XML,我想你只是在最后缺少</gpx>,或者你可以在最后做/>自己关闭它。

+0

我不认为这是OP的整个XML文档;这只是第一个标签。 (基于第一句中的“*开头如下*”声明。) –

+0

感谢您的关注,但我只是展示了xml文件的一部分。如果xmlns属性不存在,它将在其他地方关闭并正确解析。 – Ian

0

您正在使用xmlns定义一个名称空间(因此您的所有标记名称将以您在此属性中定义的任何内容开始),我猜测该模式无法识别。

0

我还没有制定出如何解决问题,但如果其他人有相同的问题,您可以使用正则表达式从xml中删除xmlns属性。

private static InputStream stripDeclaration(InputStream is) throws UnsupportedEncodingException { 
    String string = new Scanner(is).useDelimiter("\\A").next(); 
    string = string.replaceFirst("xmlns=\".*?\"", ""); 
    return new ByteArrayInputStream(string.getBytes("UTF-8"));  
} 

,因为你需要创建一个字符串出几乎击败了SAX解析器的点你enitre XML文件。这是不理想的。任何更好的想法都非常受欢迎!