2

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

4 回答 4

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 声明麻烦。

于 2012-08-06T07:22:38.297 回答
2

我突然想到,为处理 HTML 而制作的解析器可能会做你想做的事。由于与严格的 XML 相比,HTML 往往是一团糟,因此 HTML 解析器通常更具容错性。快速搜索出现了jsoup。我respCode大致可以使用以下代码从您的示例 XML 中提取:

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 中测试了该库,但上面的代码应该可以工作!)

于 2012-08-14T14:14:20.450 回答
0

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

为什么你的皂体含有这个?您可以选择删除它吗?

于 2012-08-06T07:20:14.947 回答
0

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

于 2012-08-12T07:56:06.727 回答