使用Java Joost的STX解析器匹配XML不同块的解决方案
解决方案:用STX的
<stx:map>实现ID匹配与属性合并 STX(Streaming Transformations for XML)的Java Joost实现支持<stx:map>,这正是你需要的类似HashMap的键值对存储机制,可用来缓存<description>的id和size属性,后续处理<item>时匹配对应值,且流式处理的特性适合大型XML文件。
以下是完整的STX转换脚本:
<?xml version="1.0" encoding="UTF-8"?> <stx:transform version="1.0" xmlns:stx="http://stx.sourceforge.net/2002/ns"> <!-- 定义映射表,存储id到size的对应关系 --> <stx:map name="sizeMap"/> <!-- 处理description元素,将id和size存入映射表 --> <stx:template match="description"> <stx:put-into-map name="sizeMap" key="@id" value="@size"/> </stx:template> <!-- 处理根元素main,输出目标根节点total --> <stx:template match="main"> <total> <stx:process-children select="products/item"/> </total> </stx:template> <!-- 处理item元素,合并原有属性与匹配到的size属性 --> <stx:template match="item"> <item> <!-- 复制item原有的所有属性 --> <stx:copy-of select="@*"/> <!-- 根据id从映射表取出size并添加为新属性 --> <stx:if test="stx:get-from-map('sizeMap', @id)"> <stx:attribute name="size" select="stx:get-from-map('sizeMap', @id)"/> </stx:if> </item> </stx:template> <!-- 忽略无需处理的元素,避免冗余输出 --> <stx:template match="*"/> </stx:transform>
脚本关键说明
<stx:map name="sizeMap"/>:创建映射表,以description的id为键、size为值存储数据,流式处理不占用过多内存。<stx:put-into-map>:遍历<description>时完成键值对存储,属于单次流式操作。<stx:get-from-map>:处理<item>时,通过当前元素的id从映射表中取出对应size,实现属性合并。
Java代码调用示例
如果需要用Java代码执行该转换,可参考以下实现:
import net.sf.joost.TransformerFactory; import net.sf.joost.Transformer; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class JoostXmlMerge { public static void main(String[] args) { try { InputSource stxSource = new InputSource(new File("transform.stx").toURI().toString()); InputSource xmlSource = new InputSource(new File("input.xml").toURI().toString()); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(stxSource); transformer.transform(xmlSource, new FileOutputStream("output.xml")); System.out.println("XML转换完成"); } catch (SAXException | IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者srgplv
相关产品推荐
相关产品推荐

