将正确的xml转换为不正确的xml

时间:2015-09-15 06:12:48

标签: java xml

我有一个要求,我需要使用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。 我不知道如何继续,因为我无法想到任何标准方法,任何关于最佳处理方式的建议。

4 个答案:

答案 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>&lt;1start&gt;</xsl:text>
        <xsl:apply-templates/>
        <xsl:text>&lt;/1start&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="/start/level">
        <xsl:text>&lt;level&gt;</xsl:text>
        <xsl:value-of select="text()"/>
        <xsl:text>&lt;/level&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="/start/reach_port">
        <xsl:text>&lt;reach_port=&quot;</xsl:text>
        <xsl:value-of select="text()"/>
        <xsl:text>&quot;/&gt;</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"/>