2012-04-03 63 views
-2

自定義字符串格式需要xml幫助。 Java和C#。將自定義字符串轉換爲xml

[Node(X)][CHILD0(Y)][OBJECT1(A)][Key1(1)][Key2(2)]
[Node(X)][CHILD0(Y)][OBJECT1(B)][Key1(1)][Key2(2)][Key3(3)]
[Node(X)][CHILD0(Y)][OBJECT1(C)][Key1(4)]
[Node(X)][CHILD0(Y)][OBJECT2(A)][Key1(1)][Key2(2)][Key3(3)]
[Node(X)][CHILD0(Y)][OBJECT2(B)][Key1(4)][Key2(5)]
[Node(X)][CHILD1(Z)][OBJECT1(A)][Key1(7)][Key2(8)][Key3(9)]
[Node(X)][CHILD1(Z)][OBJECT2(A)][Key1(15)][Key2(18)]

可能有 'N' 的字符串的行類似於上述樣本數。 什麼是最好的方法將此序列化爲如下的xml文件

如果下面顯示的xml也不正確,那麼請告知正確的格式。 我嘗試使用在stackoverflow和代碼項目中提供的一些示例序列化,但我無法 以下面的格式獲取xml。試圖在java和c#中做到這一點。謝謝大家。

[X] 
    [Y] 
     [OBJECT1] 
      [A] 
       <Key1>1</Key1> 
       <Key2>2</Key2> 
      [/A] 
      [B] 
      <Key1>2</Key1> 
      <Key2>2</Key2> 
      <Key3>3</Key3> 
     [/B] 
     [C] 
      <Key1>4</Key1> 
     [/C] 
    [/OBJECT1] 
    [OBJECT2] 
     [A] 
      <Key1>1</Key1> 
      <Key2>2</Key2> 
      <Key3>3</Key3> 
     [/A] 
     [B] 
      <Key1>4</Key1> 
      <Key2>5</Key2> 
     [/B] 
    [/OBJECT2] 
    [/Y] 
    [Z] 
     [OBJECT1] 
     [A] 
      <Key1>7</Key1> 
      <Key2>8</Key2> 
      <Key2>9</Key2> 
      [/A] 
     [/OBJECT1] 
     [OBJECT2] 
     [A] 
      <Key1>15</Key1> 
      <Key2>18</Key2> 
     [/A] 
     [/OBJECT2] 
    [/Z] 
[/X] 
+1

這看起來不像XML,你的代碼在哪裏?你到底在做什麼?和Java或C# - 選擇一個,它們是無關的。 – Mat 2012-04-03 17:11:14

+0

@Mat - 對不起,如果我的問題很混亂。我有n個自定義格式的字符串。 [Key(Value)] [Key(Value)] ...以及[Key(Value)]對的可變數量。我想序列化到一個XML文件。正如我在我的初始文章中提到的,如果xml格式不正確,請忽略它並建議實現此目的的最佳方法。謝謝。 – 2012-04-03 17:16:52

+0

哎呀,忘了提。這是在Java上。謝謝。 – 2012-04-03 17:17:28

回答

1

這裏是供您使用的解析器類:

public class XmlSerializer { 

private String input; 
private Element currentNode, currentChild, currentObject; 
private Map<String, Element> nodes; 
private Map<Element, Map<String, Element>> children, objects; 

/** 
* Initializes the serializer with the given input string. 
* @param input input string 
*/ 
public XmlSerializer(String input) { 
    this.input = input; 
    this.nodes = new HashMap<String, Element>(); 
    this.children = new HashMap<Element, Map<String,Element>>(); 
    this.objects = new HashMap<Element, Map<String,Element>>(); 
} 

/** 
* Parses the input string and returns the XML document. 
* @return XML document 
*/ 
public Document parseDocument() 
throws ParserConfigurationException { 
    Pattern pattern = Pattern.compile("\\[(.+?)\\((.+?)\\)\\]"); 
    Matcher matcher = pattern.matcher(input); 
    Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    Element root = dom.createElement("root"); 
    dom.appendChild(root); 

    while (matcher.find()) { 
     String key = matcher.group(1); 
     String value = matcher.group(2); 

     if ("Node".equals(key)) { 
      currentNode = parseElement(key, value, dom, root, nodes, children); 
     } else if (currentNode != null && key.startsWith("CHILD")) { 
      currentChild = parseElement(key, value, dom, currentNode, 
        children.get(currentNode), objects); 
     } else if (currentChild != null && key.startsWith("OBJECT")) { 
      currentObject = parseElement(key, value, dom, currentChild, 
        objects.get(currentChild), null); 
     } else { 
      Element property = parseProperty(key, value, dom); 
      currentObject.appendChild(property); 
     } 
    } 

    return dom; 
} 

/** 
* Returns the parsed XML document as string. 
* @return XML document as string 
*/ 
public String toXML() 
throws TransformerFactoryConfigurationError, ParserConfigurationException, TransformerException { 
    StringWriter writer = new StringWriter(); 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
    Source source = new DOMSource(parseDocument()); 
    Result result = new StreamResult(writer); 
    transformer.transform(source, result); 
    return writer.getBuffer().toString(); 
} 

/** 
* Parses an element. 
* @param key  key in {@code [key(value)]} string 
* @param value value in {@code [key(value)]} string 
* @param dom  DOM 
* @param parent parent element to add this element to 
* @param cache cache for the parsed element 
* @param subCache sub-cache to initialize (optional) 
* @return the element 
*/ 
private Element parseElement(String key, String value, Document dom, Element parent, 
     Map<String, Element> cache, Map<Element, Map<String, Element>> subCache) { 
    Element el = cache.get(value); 
    if (el == null) { 
     el = dom.createElement(value); 
     cache.put(key, el); 
     parent.appendChild(el); 
     if (subCache != null) 
      subCache.put(el, new HashMap<String, Element>()); 
    } 
    return el; 
} 

/** 
* Parses a property element. 
* @param key key in {@code [key(value)]} string 
* @param value value in {@code [key(value)]} string 
* @param dom DOM 
* @return the element 
*/ 
private Element parseProperty(String key, String value, Document dom) { 
    Element property = dom.createElement(key); 
    property.setTextContent(value); 
    return property; 
} 

} 

使用方法如下:

String input; // [Node(X)][CHILD0(Y)][OBJECT1(A)][Key1(1)][Key2(2)]... 
String xml = new XmlSerializer(input).toXML(); 
System.out.println(xml); 

輸出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root> 
    <X> 
    <Y> 
     <A> 
     <Key1>1</Key1> 
     <Key2>2</Key2> 
     </A> 
    </Y> 
    <Y> 
     <B> 
     <Key1>1</Key1> 
     <Key2>2</Key2> 
     <Key3>3</Key3> 
     </B> 
    </Y> 
    </X> 
    <X> 
    <Y> 
     <C> 
     <Key1>4</Key1> 
     </C> 
    </Y> 
    </X> 
    <X> 
    <Y> 
     <A> 
     <Key1>1</Key1> 
     <Key2>2</Key2> 
     <Key3>3</Key3> 
     </A> 
    </Y> 
    </X> 
    <X> 
    <Y> 
     <B> 
     <Key1>4</Key1> 
     <Key2>5</Key2> 
     </B> 
    </Y> 
    </X> 
    <X> 
    <Z> 
     <A> 
     <Key1>7</Key1> 
     <Key2>8</Key2> 
     <Key3>9</Key3> 
     </A> 
    </Z> 
    </X> 
    <X> 
    <Z> 
     <A> 
     <Key1>15</Key1> 
     <Key2>18</Key2> 
     </A> 
    </Z> 
    </X> 
</root> 

何去何從並優化它很少,例如,如果你不想重複d <X>...</X>節點。

+0

非常感謝jabu。感謝您的時間和精力。 – 2012-04-03 18:59:53