2013-04-29 94 views
0

我需要這樣的皈依:轉換XML標籤

給出的(許多之一):

<Field name="topmostSubform[0].Page1[0].MemberID[0]" value="025620451" /> 

我需要將其轉換爲這樣一個xml:

<?xml version="1.0" encoding="UTF-8"?> 
<topmostSubform ind="0"> 
    <page ind ="0"> 
     <MemeberID ind="0">025620451</MemeberID> 
    </page> 
</topmostSubform> 

我得到了一堆字段,就像我需要轉換爲一個xml的例子。

字段標籤可以包含更多標籤,然後是示例。

你建議採用什麼方法?

難度是什麼數據結構使用?我怎樣才能填充這個數據庫,所以最終我可以創建一個XML呢?

我試着在迭代輸入的同時使用DOM構建xml,但是在那種情況下,我創建了很多重複標記。

謝謝。

回答

1

xpath的組合檢查元素是否已經存在,遞歸會做你想做的。

這是我想出了:

import java.io.ByteArrayInputStream; 
import java.io.StringWriter; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

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

public class Transformation 
{ 
    private static final XPath XPATH = XPathFactory.newInstance().newXPath(); 

    public static void main(String[] args) 
    { 
    try 
    { 
     DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 

     Document xml1 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[0].Page[0].MemberID[0]\" value=\"1\"/>".getBytes())); 
     Document xml2 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[0].Page[0].MemberID[1]\" value=\"2\"/>".getBytes())); 
     Document xml3 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[0].Page[1].MemberID[0]\" value=\"3\"/>".getBytes())); 
     Document xml4 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[1].Page[0].MemberID[0]\" value=\"4\"/>".getBytes())); 

     Document document = documentBuilder.newDocument(); 
     document.appendChild(document.createElement("root")); 

     //Loop through each piece of XML creating elements in the single document as necessary. 
     for (Document xml : new Document[]{xml1, xml2, xml3, xml4}) 
     { 
     Element fieldElement = (Element)XPATH.evaluate("/Field", xml, XPathConstants.NODE); 

     String name = fieldElement.getAttribute("name"); 
     String value = fieldElement.getAttribute("value"); 

     createElements(
      document, 
      document.getDocumentElement(), 
      new ArrayList<String>(Arrays.asList(name.split("\\."))), 
      value 
     ); 
     } 

     //Print the result at the command line. 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 

     StringWriter writer = new StringWriter(); 
     transformer.transform(new DOMSource(document), new StreamResult(writer)); 

     System.out.println(writer.getBuffer().toString()); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    /** 
    * Creates child elements under the <code>parent</code> based on the <code>nameTokens</code>. 
    */ 
    private static void createElements(Document document, Element parent, List<String> nameTokens, String value) throws XPathExpressionException 
    { 
    String nameToken = nameTokens.remove(0); 

    String name = nameToken.substring(0, nameToken.indexOf("[")); 
    String index = nameToken.substring(nameToken.indexOf("[") + 1, nameToken.indexOf("]")); 

    Element element = (Element)XPATH.evaluate(name + "[@ind=" + index + "]", parent, XPathConstants.NODE); 
    if (element == null) 
    { 
     element = document.createElement(name); 
     element.setAttribute("ind", index); 
     parent.appendChild(element); 
    } 

    if (nameTokens.isEmpty()) 
    { 
     element.appendChild(document.createTextNode(value)); 
    } 
    else 
    { 
     createElements(document, element, nameTokens, value); 
    } 
    } 
} 

哪個(格式化後)打印此:

<root> 
    <topmostSubform ind="0"> 
    <Page ind="0"> 
     <MemberID ind="0">1</MemberID> 
     <MemberID ind="1">2</MemberID> 
    </Page> 
    <Page ind="1"> 
     <MemberID ind="0">3</MemberID> 
    </Page> 
    </topmostSubform> 
    <topmostSubform ind="1"> 
     <Page ind="0"> 
     <MemberID ind="0">4</MemberID> 
     </Page> 
    </topmostSubform> 
</root> 
+0

偉大的工作尼克! – 2013-05-01 07:40:44