2009-03-10 46 views
7

Nếu tôi có một tài liệu XML nhưLàm cách nào để trích xuất phần tử con từ XML thành một chuỗi trong Java?

<root> 
    <element1> 
     <child attr1="blah"> 
      <child2>blahblah</child2> 
     <child> 
    </element1> 
</root> 

Tôi muốn để có được một chuỗi XML với các phần tử con đầu tiên. Chuỗi đầu ra của tôi sẽ là

<element1> 
    <child attr1="blah"> 
     <child2>blahblah</child2> 
    <child> 
</element1> 

Có nhiều cách tiếp cận, muốn xem một số ý tưởng. Tôi đã cố gắng sử dụng Java XML API cho nó, nhưng nó không rõ ràng rằng có một cách tốt để làm điều này.

cảm ơn

Trả lời

7

Bạn nói đúng, với các API XML tiêu chuẩn, có không phải là một cách tốt - đây là một ví dụ (có thể lỗi cưỡi; nó chạy, nhưng tôi đã viết nó từ lâu rồi).

import javax.xml.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.stream.*; 
import org.w3c.dom.*; 
import java.io.*; 

public class Proc 
{ 
    public static void main(String[] args) throws Exception 
    { 
     //Parse the input document 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new File("in.xml")); 

     //Set up the transformer to write the output string 
     TransformerFactory tFactory = TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(); 
     transformer.setOutputProperty("indent", "yes"); 
     StringWriter sw = new StringWriter(); 
     StreamResult result = new StreamResult(sw); 

     //Find the first child node - this could be done with xpath as well 
     NodeList nl = doc.getDocumentElement().getChildNodes(); 
     DOMSource source = null; 
     for(int x = 0;x < nl.getLength();x++) 
     { 
      Node e = nl.item(x); 
      if(e instanceof Element) 
      { 
       source = new DOMSource(e); 
       break; 
      } 
     } 

     //Do the transformation and output 
     transformer.transform(source, result); 
     System.out.println(sw.toString()); 
    } 
} 

Có vẻ như bạn có thể có được đứa con đầu lòng chỉ bằng cách sử dụng doc.getDocumentElement(). GetFirstChild(), nhưng vấn đề với điều đó là nếu có bất kỳ khoảng trắng giữa rễ và phần tử con, rằng sẽ tạo ra một nút văn bản trong cây, và bạn sẽ nhận được nút đó thay vì nút phần tử thực tế. Kết quả của chương trình này là:

D:\home\tmp\xml>java Proc 
<?xml version="1.0" encoding="UTF-8"?> 
<element1> 
     <child attr1="blah"> 
      <child2>blahblah</child2> 
     </child> 
    </element1> 

Tôi nghĩ bạn có thể chặn chuỗi phiên bản xml nếu bạn không cần, nhưng tôi không chắc chắn về điều đó. Tôi có lẽ sẽ cố gắng sử dụng một thư viện XML của bên thứ ba nếu có thể.

3

Tôi muốn giới thiệu JDOM. Đó là một thư viện Java XML giúp làm việc với XML dễ dàng hơn nhiều so với cách tiếp cận chuẩn W3C.

1

XMLBeans là công cụ dễ sử dụng (khi bạn sử dụng nó) để xử lý XML mà không phải giải quyết các phiền toái khi phân tích cú pháp.

Nó yêu cầu bạn có một lược đồ cho tệp XML, nhưng nó cũng cung cấp công cụ để tạo lược đồ từ tệp XML exisint (tùy thuộc vào nhu cầu của bạn được tạo ra có lẽ là tốt).

5

Do đây là google câu trả lời trên và Đối với những người bạn của những người chỉ muốn cơ bản:

public static String serializeXml(Element element) throws Exception 
{ 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    StreamResult result = new StreamResult(buffer); 

    DOMSource source = new DOMSource(element); 
    TransformerFactory.newInstance().newTransformer().transform(source, result); 

    return new String(buffer.toByteArray()); 
} 

tôi sử dụng này cho gỡ lỗi, mà rất có thể là những gì bạn cần điều này cho

+0

Bạn có biết cách ngăn biến áp thêm ? – jophde

0

Như câu hỏi thực sự là về xuất hiện đầu tiên của chuỗi bên trong một chuỗi khác, tôi sẽ sử dụng phương pháp lớp string, thay vì phân tích cú pháp XML:

public static String getElementAsString(String xml, String tagName){ 
    int beginIndex = xml.indexOf("<" + tagName); 
    int endIndex = xml.indexOf("</" + tagName, beginIndex) + tagName.length() + 3; 
    return xml.substring(beginIndex, endIndex); 
} 
0
public String getXML(String xmlContent, String tagName){ 

    String startTag = "<"+ tagName + ">"; 
    String endTag = "</"+ tagName + ">"; 
    int startposition = xmlContent.indexOf(startTag); 
    int endposition = xmlContent.indexOf(endTag, startposition); 
    if (startposition == -1){ 
     return "ddd"; 
    } 
    startposition += startTag.length(); 
    if(endposition == -1){ 
     return "eee"; 
    } 
    return xmlContent.substring(startposition, endposition); 
} 

Chuyển chuỗi xml của bạn thành phương thức này và trong trường hợp của bạn, hãy chuyển 'yếu tố' làm tên thông số.

0

Bạn có thể sử dụng chức năng sau đây để giải nén khối xml như chuỗi bằng cách thông qua biểu hiện xpath thích hợp,

private static String nodeToString(Node node) throws TransformerException 
{ 
    StringWriter buf = new StringWriter(); 
    Transformer xform = TransformerFactory.newInstance().newTransformer(); 
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    xform.transform(new DOMSource(node), new StreamResult(buf)); 
    return(buf.toString()); 
} 

    public static void main(String[] args) throws Exception 
{ 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 

     XPath xPath = XPathFactory.newInstance().newXPath(); 
     Node result = (Node)xPath.evaluate("A/B/C", doc, XPathConstants.NODE); //"A/B[id = '1']" //"//*[@type='t1']" 

     System.out.println(nodeToString(result)); 

} 
Các vấn đề liên quan