有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml Java Web服务从dom中删除cdata

我的web服务返回一个字符串(xml)我正在使用DOM构建这个字符串,现在的问题是当我想将这个xml转换成字符串时。最初添加了一个额外的CDATA,我似乎无法删除它。 我从stackoverflow中得到了这个漂亮的函数,但前面提到的问题是它添加了CDATA,我不需要它,因为我想返回Xml字符串。 请不要以为我在使用SOAPWeb服务

    public static String doctoString(Document doc) {
    try {
        StringWriter sw = new StringWriter();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.transform(new DOMSource(doc), new StreamResult(sw));
        return sw.toString();
    } catch (Exception ex) {
        throw new RuntimeException("Error converting to String", ex);
    }
}

全输出:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getInvoppResponse xmlns:ns2="http://services.com/">
         <return>
           <![CDATA[
              <users>
                 <user>
                    <id>1</id>
                    <name>sert</name>
                 </user>
              </users>
            ]]>
          </return>
      </ns2:getInvoppResponse>
   </soap:Body>
</soap:Envelope>

所需的车身输出:

           <return>           
             <users>
               <user>
                  <id>1</id>
                  <name>sert</name>
               </user>
             </users>             
           </return>

共 (1) 个答案

  1. # 1 楼答案

    对于一个不那么优雅但功能强大的Java解决方案(针对有问题的新XML进行了更新):

    p = Pattern.compile("\\A.*?(\\<users\\>.*\\<\\/users\\>).*?\\z", Pattern.DOTALL );
    s = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
    "   <soap:Body>\n" +
    "     <ns2:getInvoppResponse xmlns:ns2=\"http://services.com/\">\n" +
    "      <return>\n" +
    "        <![CDATA[\n" +
    "           <users>\n" +
    "              <user>\n" +
    "                 <id>1</id>\n" +
    "                 <name>sert</name>\n" +
    "              </user>\n" +
    "           </users>\n" +
    "         ]]>\n" +
    "       </return>\n" +
    "    </ns2:getInvoppResponse>\n" +
    "    </soap:Body>\n" +
    "</soap:Envelope>\n";
    
    Matcher m = p.matcher(s);
    if (m.matches())
    {
        s =m.group(1);
    }