這裏是供您使用的解析器類:
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>
節點。
這看起來不像XML,你的代碼在哪裏?你到底在做什麼?和Java或C# - 選擇一個,它們是無關的。 – Mat 2012-04-03 17:11:14
@Mat - 對不起,如果我的問題很混亂。我有n個自定義格式的字符串。 [Key(Value)] [Key(Value)] ...以及[Key(Value)]對的可變數量。我想序列化到一個XML文件。正如我在我的初始文章中提到的,如果xml格式不正確,請忽略它並建議實現此目的的最佳方法。謝謝。 – 2012-04-03 17:16:52
哎呀,忘了提。這是在Java上。謝謝。 – 2012-04-03 17:17:28