2012-08-06 75 views
2

您能帮我解析xml,嵌套<?xml version="1.0" encoding="utf-8"?>标签。当我试图解析这个XML,我得到解析错误。使用嵌套xml开始标签解析XML <?xml ...?> in java

<?xml version="1.0" encoding="utf-8"?>  
<soap> 
      <soapenvBody> 
       <serviceResponse> 
        <?xml version="1.0" encoding="UTF-8"?> 
        <data> 
         <respCode>0</respCode> 
        </data> 
       </serviceResponse> 
      </soapenvBody> 
     </soap> 
+0

这是没有有效的XML。 – 2012-08-06 07:18:56

+2

有没有简单的方法来解析,因为这是无效的XML。但是看到它是一种肥皂反应,它让我想知道提供给您的是什么样的服务,看看他们是否可以修复服务(或者如果您有权访问的话可以修复服务)不是更好吗? – 2012-08-06 07:19:28

+0

您可以尝试预处理流,删除无效部分(例如,使用正则表达式替换),然后使用常规XML解析器解析它。我也认为你可以使用SAX解析器解析它。 – rmaruszewski 2012-08-06 07:21:17

回答

0

以类似<?开头的标签是一个处理指令。 <?xml...>是一个XML声明,只能出现在xml内容的开头。它在XML体中是不允许的。

为什么你的肥皂身体包含这个?你有选择删除它吗?

+0

回复。我不能控制我接收的xml。所以我预处理了XML然后解析它。 – 2012-08-12 07:47:44

2

我不认为这是一个真正的Java问题。在XML主体中有第二个XML声明是非法的,所以我认为你不能得到任何XML解析器来解析它。如果你有过XML控制(它看起来像你生成它来存储的响应),那么你可以尝试用CDATA包裹内的XML文档:

<?xml version="1.0" encoding="utf-8"?>  
<soap> 
    <soapenvBody> 
     <serviceResponse> 
      <![CDATA[ 
       <?xml version="1.0" encoding="UTF-8"?> 
       <data> 
        <respCode>0</respCode> 
       </data> 
      ]]> 
     </serviceResponse> 
    </soapenvBody> 
</soap> 

编辑:

我在想,你很可能不希望在这个响应里面额外的XML声明。你是否可以控制创建响应的代码?我的猜测是,将XML片段<data>...</data>创建为单独的DOM对象,然后将字符串拼接在响应的中间。写出整个XML文档对象会导致包含XML声明,但如果您只抓取文档根节点对象<data>)并将其写入为字符串,那么它可能不会包含额外的XML声明那会给你带来麻烦。

+0

感谢您的回复。实际上我没有控制xlm响应,我知道它不是有效的xml。所以我选择了xml预处理选项并选择了内部xml,然后使用SAX parse解析它并能够检索我想要的数据:)。再次感谢。 – 2012-08-12 07:45:59

+0

今天下午我做了一些工作后,我想到了一个新的解决方案,但由于这与我的评论完全无关,所以我决定将它作为一个单独的答案发布。 – DaoWen 2012-08-14 14:28:46

0

我没有在java中找到任何解析器来解析这样的嵌入式xml,因为它不是一个有效的xml,我想几乎所有的解析在分析它之前验证xml。所以我选择预处理xml选项并选择内部xml然后使用SAX解析器我解析了xml并从xml中检索了值。伙计们感谢你的回复。

+1

自你原来的文章已经过去了一个星期,所以你可能已经从这里开始了 - 但如果你仍然对分析没有预处理感兴趣,你应该看看我关于使用Jsoup的新答案。 – DaoWen 2012-08-15 03:10:58

2

我想到一个用于处理HTML的解析器可能能够做你想做的。由于与严格的XML相比,HTML往往是一团糟,因此HTML解析器通常具有更高的容错性。快速搜索出现了jsoup。我能够从你的示例XML拉respCode上面大致是这样的代码:

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 

String data = "your xml goes here"; 
Document doc = Jsoup.parse(data); 
String respCodeRaw = doc.select("respCode").first().text(); 
int respCode = Integer.valueOf(respCodeRaw); 

(!我实际测试库在Clojure的REPL,但上面的代码应该工作)

+0

非常感谢您的帮助。我会尝试这个选项。 – 2012-08-15 12:28:31