我有一个要求,我需要使用java将给定的正确xml转换为不正确的格式。
我收到的Xml就像是
<?xml version="1.0" encoding="utf-8" ?>
<start>
<level>5</level>
<mode>passive</mode>
<directory>home/lib/dir</directory>
<reach_port>8888</reach_port>
<languages default="en">en,ar,bn</languages>
<Server_port>8800</Server_port>
<reset_time>180</reset_time>
<refresh_rate>10</refresh_rate>
</start>
我需要将其转换为以下格式
<?xml version="1.0" encoding="utf-8" ?>
<1start> -> XML Tag is starting with number
<level>5</level>
<mode>passive</mode>
<directory>home/lib/dir</directory>
<reach_port="8888"/> -> Syntax is not recognizable
<languages default="en">en,ar,bn</languages>
<Server_port="8800"/> -> Syntax is not recognizable
<reset_time="180"/> -> Syntax is not recognizable
<refresh_rate="10"/> -> Syntax is not recognizable
</1start>
我需要严格遵守这种格式,因为进一步的依赖需要这种格式的xml。 我不知道如何继续,因为我无法想到任何标准方法,任何关于最佳处理方式的建议。
答案 0 :(得分:4)
布莱什!欢迎来到真实世界的软件工程:(。如果我正确理解了这个问题,你唯一的要求是生成这个废话,而不是解析它。祝福你!祝你好运!JB Nizet是完全正确的,你不应该被要求这样做,但有时候你别无选择。如果我每次都得到一分钱,我必须同样补偿一个外部派对&#39;无能......
架构明智,关键是(显然)将Crap隔离层放在系统的最边缘,即在系统范围内以理智的方式处理所有内容,并将此标签保留为最终阶段输出。从它的外观来看,你已经这样做了。
这样的XSLT模板可以工作:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/start">
<xsl:text><1start></xsl:text>
<xsl:apply-templates/>
<xsl:text></1start></xsl:text>
</xsl:template>
<xsl:template match="/start/level">
<xsl:text><level></xsl:text>
<xsl:value-of select="text()"/>
<xsl:text></level></xsl:text>
</xsl:template>
<xsl:template match="/start/reach_port">
<xsl:text><reach_port="</xsl:text>
<xsl:value-of select="text()"/>
<xsl:text>"/></xsl:text>
</xsl:template>
<!-- process other elements in the same way -->
</xsl:stylesheet>
答案 1 :(得分:1)
使用SAX,参见Simple API for XML,依次接收每个元素并将转换后的元素写入文本流。
答案 2 :(得分:0)
这个问题没有好的答案,但这是用Java做的一种方法
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.ParserConfigurationException;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.xml.sax.SAXException;
public class XmlInvalidGenerator {
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, JDOMException {
final String xmlString = ""
+ "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
+ "<start>"
+ "<level>5</level>"
+ "<mode>passive</mode>"
+ "<directory>home/lib/dir</directory>"
+ "<reach_port>8888</reach_port>"
+ "<languages default=\"en\">en,ar,bn</languages>"
+ "<Server_port>8800</Server_port>"
+ "<reset_time>180</reset_time>"
+ "<refresh_rate>10</refresh_rate>"
+ "</start>";
final Document document = new SAXBuilder().build(new StringReader(xmlString));
final Element start = document.getRootElement();
final String level = start.getChild("level").getValue();
final String mode = start.getChild("mode").getValue();
final String directory = start.getChild("directory").getValue();
final String reach_port = start.getChild("reach_port").getValue();
final Element languages = start.getChild("languages");
final String server_port = start.getChild("Server_port").getValue();
final String reset_time = start.getChild("reset_time").getValue();
final String refresh_rate = start.getChild("refresh_rate").getValue();
final StringBuilder stringBuilder = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
stringBuilder.append("<1start?").append("\n");
stringBuilder.append("<level>").append(level).append("</level>").append("\n");
stringBuilder.append("<mode>").append(mode).append("</mode>").append("\n");
stringBuilder.append("<directory>").append(directory).append("</directory>").append("\n");
stringBuilder.append("<reach_port=\"").append(reach_port).append("\"/>").append("\n");
stringBuilder.append("<languages default=\"").append(languages.getAttribute("default").getValue()).append("\">").append(languages.getValue()).append("</languages").append("\n");
stringBuilder.append("<Server_port=\"").append(server_port).append("\"/>").append("\n");
stringBuilder.append("<reset_time=\"").append(reset_time).append("\"/>").append("\n");
stringBuilder.append("<refresh_rate=\"").append(refresh_rate).append("\"/>").append("\n");
stringBuilder.append("</1start>");
System.out.println("stringBuilder = " + stringBuilder);
}
private static void printStartElement(Element start) {
System.out.println("start.getChildren().size() = " + start.getChildren().size());
System.out.println("level = " + start.getChild("level").getValue());
System.out.println("mode = " + start.getChild("mode").getValue());
System.out.println("directory = " + start.getChild("directory").getValue());
System.out.println("reach_port = " + start.getChild("reach_port").getValue());
final Element languages = start.getChild("languages");
System.out.println("languages(default=" + languages.getAttribute("default").getValue() + "): " + languages.getValue());
System.out.println("Server_port = " + start.getChild("Server_port").getValue());
System.out.println("reset_time = " + start.getChild("reset_time").getValue());
System.out.println("refresh_rate = " + start.getChild("refresh_rate").getValue());
}
}
祝你好运
答案 3 :(得分:0)
您可以使用正则表达式:
\<([^_<>]*_[^_<>]*)\>([^<>]*)\<[^_<>]*_[^_<>]*\>
用
替换全部<$1="$2"/>
这将使这个----&gt;进入这个
<reach_port>8888</reach_port> ----> <reach_port="8888"/>