1

我有一个包含 XML 的 java 字符串。我想通读这个 Java String 包装 CData 中的所有文本节点,只是我不知道该怎么做。这样做的原因是这是一个包含尖括号的文本节点,当我尝试解析字符串时会导致异常。任何人都可以帮助我吗?

<node> this < is text <node> <node2> this is < text <node2>

我想知道是否有一种简单的方法可以使用 XMLReader 将此文本作为字符串读取并在文本周围插入 CData

谢谢

斯特凡

4

2 回答 2

2

也许是这样的(提前为任何低效率道歉:

if(currentNode instanceof XMLNodeType.Text)  
{  
     String toWrite = String.format("<![CDATA[%s]]>", currentNode.getText());   
     // or whatever retrieves text of the node
}  

看起来您需要将数据按摩为有效的 XML。这个过程当然高度依赖于您的输入。所以基本上发生的事情是您收到一个需要将其转换为有效 XML 的大字符串。这里的好处是您可以定义第三方遵守的模式,这是与他们的会议,因此不在讨论范围内,但值得一提。一旦你定义了这个模式,你就会知道哪些节点被认为是“文本”节点并且需要被包裹在CDATA块中。

基本思想是这样的:

List<String> textTags = new ArrayList<String>();  
textTags.add("NODE");  
//other things to add
String bigAwfulString = inputFromThirdParty();   
String validXML = ""; 
for(String currentNode : bigAwfulString.split("yourRegexHere")  
{  
    if(textTags.contains(currentNode)  
    {  
           validXML+=String.format("<![CDATA[%s]]>", currentNode.getText());    
           continue;
    }   
    validXML+=currentNode;
}
于 2013-01-04T14:02:08.567 回答
0

试试这个,它对我有用。
http://www.java2s.com/Code/Java/XML/AddingaCDATASectiontoaDOMDocument.htm

import java.io.File;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class Main {
  public static void main(String[] argv) throws Exception {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);

    factory.setExpandEntityReferences(false);

    Document doc = factory.newDocumentBuilder().parse(new File("filename"));
    Element element = doc.getElementById("key1");

    // Add a CDATA section to the root element
    element = doc.getDocumentElement();
    CDATASection cdata = doc.createCDATASection("data");
    element.appendChild(cdata);

  }
}
于 2017-04-03T14:49:05.570 回答