Java/XML/CDATA

Материал из Java эксперт
Перейти к: навигация, поиск

Append and insert data to CharacterData

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CDATASection; import org.w3c.dom.CharacterData; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; 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");
   CDATASection cdataNode = doc.createCDATASection("");
   Comment commentNode = doc.createComment("");
   Text textNode = doc.createTextNode("");
   // All three types of nodes implement the CharacterData interface
   CharacterData cdata = cdataNode;
   cdata = commentNode;
   cdata = textNode;
   // data
   int offset = 5;
   cdata.insertData(offset, "a "); 
   cdata.appendData(" b"); 
 }

}


 </source>
   
  
 
  



Converting CDATA Nodes into Text Nodes While Parsing an XML File

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; public class Main {

 public static void main(String[] argv) throws Exception{
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setCoalescing(true);
   Document doc = factory.newDocumentBuilder().parse(new File("infilename.xml"));
   // doc will not contain any CDATA nodes
 }

}


 </source>
   
  
 
  



Delete data from CharacterData

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CDATASection; import org.w3c.dom.CharacterData; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; 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");
   CDATASection cdataNode = doc.createCDATASection("");
   Comment commentNode = doc.createComment("");
   Text textNode = doc.createTextNode("");
   // All three types of nodes implement the CharacterData interface
   CharacterData cdata = cdataNode;
   cdata = commentNode;
   cdata = textNode;
   // Delete text
   int offset = 0;
   int len = 5;
   cdata.deleteData(offset, len); 
 }

}


 </source>
   
  
 
  



Escaping CDATA sections.

   <source lang="java">

/*

* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.    
*/

/**

* This class is for escaping CDATA sections.
* 
* @author 
* @version $Id: Escape.java 463298 2006-10-12 16:10:32Z henning $
*/

public class Escape {

 /**
  * 
  */
 public static final String LINE_SEPARATOR = System.getProperty("line.separator");
 /**
  * Empty constructor
  */
 public Escape() {
   // left blank on purpose
 }
 /**
  * Do the escaping.
  * 
  * @param st
  * @return The escaped text.
  */
 public static final String getText(String st) {
   StringBuffer buff = new StringBuffer();
   char[] block = st.toCharArray();
   String stEntity = null;
   int i, last;
   for (i = 0, last = 0; i < block.length; i++) {
     switch (block[i]) {
     case "<":
       stEntity = "<";
       break;
     case ">":
       stEntity = ">";
       break;
     case "&":
       stEntity = "&";
       break;
     case """:
       stEntity = """;
       break;
     case "\n":
       stEntity = LINE_SEPARATOR;
       break;
     default:
       /* no-op */
       break;
     }
     if (stEntity != null) {
       buff.append(block, last, i - last);
       buff.append(stEntity);
       stEntity = null;
       last = i + 1;
     }
   }
   if (last < block.length) {
     buff.append(block, last, i - last);
   }
   return buff.toString();
 }

}

 </source>
   
  
 
  



Get character data (CDATA) from xml document

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Main {

 public static void main(String[] args) throws Exception {
   File file = new File("data.xml");
   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
   Document doc = builder.parse(file);
   NodeList nodes = doc.getElementsByTagName("topic");
   for (int i = 0; i < nodes.getLength(); i++) {
     Element element = (Element) nodes.item(i);
     NodeList title = element.getElementsByTagName("title");
     Element line = (Element) title.item(0);
     System.out.println("Title: " + getCharacterDataFromElement(line));
   }
 }
 public static String getCharacterDataFromElement(Element e) {
   Node child = e.getFirstChild();
   if (child instanceof CharacterData) {
     CharacterData cd = (CharacterData) child;
     return cd.getData();
   }
   return "";
 }

}


 </source>
   
  
 
  



Get substring from CharacterData

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CDATASection; import org.w3c.dom.CharacterData; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; 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");
   CDATASection cdataNode = doc.createCDATASection("");
   Comment commentNode = doc.createComment("");
   Text textNode = doc.createTextNode("");
   // All three types of nodes implement the CharacterData interface
   CharacterData cdata = cdataNode;
   cdata = commentNode;
   cdata = textNode;
   cdata.setData("some data");
   int len = cdata.getLength();
   int offset = 5;
   len = 4;
   String s = cdata.substringData(offset, len);
 }

}


 </source>
   
  
 
  



Replace Data in CharacterData

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CDATASection; import org.w3c.dom.CharacterData; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; 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");
   CDATASection cdataNode = doc.createCDATASection("");
   Comment commentNode = doc.createComment("");
   Text textNode = doc.createTextNode("");
   // All three types of nodes implement the CharacterData interface
   CharacterData cdata = cdataNode;
   cdata = commentNode;
   cdata = textNode;
   // Replace text
   String replacement = "c";
   int offset = 10;
   int len = 6;
   cdata.replaceData(offset, len, replacement);
 }

}


 </source>
   
  
 
  



Set Data to Character Data

   <source lang="java">
  

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CDATASection; import org.w3c.dom.CharacterData; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; 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");
   CDATASection cdataNode = doc.createCDATASection("");
   Comment commentNode = doc.createComment("");
   Text textNode = doc.createTextNode("");

   CharacterData cdata = cdataNode;
   cdata = commentNode;
   cdata = textNode;
   cdata.setData("some data");
   int len = cdata.getLength();
 }

}


 </source>
   
  
 
  



Strip CDATA

   <source lang="java">

public class Utils {

 public static String stripCDATA(String s) {
   s = s.trim();
   if (s.startsWith("<![CDATA[")) {
     s = s.substring(9);
     int i = s.indexOf("]]>");
     if (i == -1) {
       throw new IllegalStateException(
           "argument starts with <![CDATA[ but cannot find pairing ]]>");
     }
     s = s.substring(0, i);
   }
   return s;
 }

}

 </source>