【问题标题】:Wrap XML Element wth text using Java?使用Java用文本包装XML元素?
【发布时间】:2009-12-31 03:10:05
【问题描述】:

我想像这样转换 XML:

<account>Wally World</account>
<city>Anywhere</city>
<state>CA</state>

通过用等号和单引号将每个元素包装起来,即=''

<account>='Wally World'</account>
<city>='Anywhere'</city>
<state>='CA'</state>

需要使用 Java 转换大型 XML 文件中的所有元素文本,也许使用 XSLT?

【问题讨论】:

  • 当然你可以用 XSLT 做到这一点。真正的问题是:为什么?这对我来说几乎没有意义。
  • 好吧,如果你看下面的代码,我能想到一个原因。在 XSLT 中只有几行代码。

标签: java xml xslt


【解决方案1】:

在 XSLT 中可能是这样的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

    <xsl:template match="account|city|state">
        <xsl:element name="{local-name(.)}">
            <xsl:text disable-output-escaping="yes">=&apos;</xsl:text>
            <xsl:value-of select="text()"/>
            <xsl:text disable-output-escaping="yes">&apos;</xsl:text>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

请注意,它只会更改帐户、城市和州的元素,而保持所有其他元素不变。所以像这样的文件:

<items>
    <item>
        <account>Wally World</account>
        <city>Anywhere</city>
        <state>CA</state>
    </item>
</items>

... 会变成这样:

<items>
    <item>
        <account>='Wally World'</account>
        <city>='Anywhere'</city>
        <state>='CA'</state>
    </item>
</items>

【讨论】:

    【解决方案2】:

    如果您只想使用 SAX 进行这种简单的更改,代码如下:

    import org.xml.sax.Attributes;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLFilterImpl;
    import org.xml.sax.helpers.XMLReaderFactory;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.sax.SAXSource;
    import javax.xml.transform.sax.SAXTransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Set;
    
    public class XMLPipeline {
    
        public static void main(String[] args) throws Exception {
            String inputFile = "a.xml";
            PrintStream outputStream = System.out;
            new XMLPipeline().process(inputFile, outputStream);
        }
    
        //default JDK
        public void process(String inputFile, OutputStream outputStream) throws
                SAXException, ParserConfigurationException, IOException, TransformerException {
            StreamResult xwriter = new StreamResult(outputStream);
            XMLReader xreader = XMLReaderFactory.createXMLReader();
            XMLAnalyzer analyzer = new XMLAnalyzer(xreader);
            TransformerFactory stf = SAXTransformerFactory.newInstance();
            SAXSource ss = new SAXSource(analyzer, new InputSource(inputFile));
            stf.newTransformer().transform(ss, xwriter);
        }
    
        public static class XMLAnalyzer extends XMLFilterImpl {
    
            private Set<String> tags = new HashSet<String>(Arrays.asList("account", "city", "state"));
            boolean bufferText = false;
            StringBuilder buffer;
    
            public XMLAnalyzer(XMLReader xmlReader) {
                super(xmlReader);
            }
    
    
            @Override
            public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
                super.startElement(uri, localName, qName, atts);
                if (tags.contains(localName)) {
                    buffer = new StringBuilder("='");
                    bufferText = true;
                }
            }
    
            @Override
            public void characters(char[] chars, int i, int i1) throws SAXException {
                if (bufferText) {
                    buffer.append(chars, i, i1);
                } else {
                    super.characters(chars, i, i1);
                }
            }
    
            @Override
            public void endElement(String s, String s1, String s2) throws SAXException {
                if (bufferText) {
                    buffer.append('\'');
                    super.characters(buffer.toString().toCharArray(), 0, buffer.length());
                    bufferText = false;
                }
                super.endElement(s, s1, s2);
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多