你能帮我解析嵌套<?xml version="1.0" encoding="utf-8"?>
标签的xml吗?当我试图解析这个xml时,我得到解析错误。
<?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 :(得分: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声明,这会导致你遇到这些麻烦。
答案 1 :(得分: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中测试了库,但上面的代码应该可以工作!)
答案 2 :(得分:0)
以<?
开头的标记是处理指令。 <?xml...>
是一个XML声明,只能出现在xml内容的开头。它在XML体中是不允许的。
为什么你的肥皂体包含这个?你可以选择删除吗?
答案 3 :(得分:0)
我没有在java中找到任何解析器来解析这样的嵌入式xml,因为它不是一个有效的xml,我想几乎所有的解析都会在解析之前验证xml。所以我选择预处理xml的选项并选择内部xml然后使用SAX解析器我解析了xml并从xml中检索了值。伙计们感谢您的回复。