使用Java将XML元素包装为文本?
我想像这样转换XML:使用Java将XML元素包装为文本?,java,xml,xslt,Java,Xml,Xslt,我想像这样转换XML: <account>Wally World</account> <city>Anywhere</city> <state>CA</state> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match=
<account>Wally World</account>
<city>Anywhere</city>
<state>CA</state>
<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">='</xsl:text>
<xsl:value-of select="text()"/>
<xsl:text disable-output-escaping="yes">'</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>
沃利世界
在任何地方
加利福尼亚州
将每个元素用等号和单引号括起来,即=“”
='Wally World'
='Anywhere'
='CA'
需要使用Java(可能是XSLT)转换大型XML文件中的所有元素文本吗?如果您只想使用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);
}
}
}
import org.xml.sax.Attributes;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
导入org.xml.sax.XMLReader;
导入org.xml.sax.helpers.XMLFilterImpl;
导入org.xml.sax.helpers.XMLReaderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.sax.SAXSource;
导入javax.xml.transform.sax.saxtranformerFactory;
导入javax.xml.transform.stream.StreamResult;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintStream;
导入java.util.array;
导入java.util.HashSet;
导入java.util.Set;
公共类XML管道{
公共静态void main(字符串[]args)引发异常{
字符串inputFile=“a.xml”;
PrintStream outputStream=System.out;
新的XMLPipeline().process(inputFile,outputStream);
}
//默认JDK
公共void进程(字符串inputFile、OutputStream OutputStream)抛出
SAXException、ParserConfiguration异常、IOException、TransformerException{
StreamResult xwriter=新的StreamResult(outputStream);
XMLReader=XMLReaderFactory.createXMLReader();
XMLAnalyzer=新的XMLAnalyzer(xreader);
TransformerFactory stf=saxtranformerFactory.newInstance();
SAXSource ss=新SAXSource(分析器,新输入源(输入文件));
stf.新变压器().变换(ss,XRITER);
}
公共静态类XMLAnalyzer扩展了XMLFilterImpl{
私有集标记=新的HashSet(Arrays.asList(“account”、“city”、“state”);
布尔缓冲文本=假;
StringBuilder缓冲区;
公共XMLAnalyzer(XMLReader XMLReader){
超级(xmlReader);
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性atts)引发异常{
super.startElement(uri、localName、qName、atts);
if(tags.contains(localName)){
缓冲区=新的StringBuilder(“=”);
bufferText=true;
}
}
@凌驾
公共无效字符(char[]chars,int i,int i1)引发异常{
如果(缓冲文本){
追加(chars,i,i1);
}否则{
超级字符(chars,i,i1);
}
}
@凌驾
公共void endElement(字符串s、字符串s1、字符串s2)引发SAXException{
如果(缓冲文本){
buffer.append('\'');
super.characters(buffer.toString().toCharray(),0,buffer.length());
bufferText=false;
}
超级元素(s、s1、s2);
}
}
}
在XSLT中,它可以是这样的:
<account>Wally World</account>
<city>Anywhere</city>
<state>CA</state>
<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">='</xsl:text>
<xsl:value-of select="text()"/>
<xsl:text disable-output-escaping="yes">'</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>
=&apos;
&载脂蛋白;
请注意,它将只更改account、city和state元素,并保留所有其他元素不变。所以像这样的文件:
<account>Wally World</account>
<city>Anywhere</city>
<state>CA</state>
<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">='</xsl:text>
<xsl:value-of select="text()"/>
<xsl:text disable-output-escaping="yes">'</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>
='Wally World'
='Anywhere'
='CA'
请确保您可以使用XSLT完成此操作。真正的问题是:为什么?这对我来说没有什么意义,如果你看看下面的代码,我能想到一个原因。在XSLT中,它只需要几行。