在java中使用嵌套的xml开始标记<! - ?xml ...? - >解析XML

时间:2012-08-06 07:14:32

标签: java xml xml-parsing

你能帮我解析嵌套<?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>  

4 个答案:

答案 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中检索了值。伙计们感谢您的回复。