我正在开发一个需要动态修改xml文件的项目,这主要涉及在文件中添加新条目(元素/节点)。
但是,有以下注意事项:
我尝试过使用JAXB,XML Startlet和Eclipse Epsilon EOL,但这些问题一直存在。
JAXB 在很大程度上起作用,除了它执行的字符不必要的转义,但我需要的东西除了java。
使用 XmlStartlet ,可以停止转义,但问题是,它只会附加新元素。
考虑:
xyz.xml
<school>
<student no="1"/>
<student no="2"/>
<teacher no="t1"/>
<teacher no="t2"/>
..
..
</school>
现在,命令
xml ed -s /school -t elem -n "student" xyz.xml
在最后添加student
:
<school>
<student no="1"/>
<student no="2"/>
<!--New student should be added here!!-->
<teacher no="t1"/>
<teacher no="t2"/>
..
..
<student/>
</school>
使用 Epsilon Eols ,也无法在正确的位置添加节点(它也会附加),而且将字符串中的双引号转义为 “”(与JAXB一样)
例如:
<student id ="123" status='query.isdaysScholar("123")/>
运行EOL后,会出现:
<student id ="123" status="query.isdayscholar("123")/>
是否有其他解析器或XML脚本/查询语言可以允许我修改XML文档并提供上述功能?
答案 0 :(得分:0)
您可以使用更具体的xmlstarlet表达式xpath来实现它,例如:
xmlstarlet ed --omit-decl -a '/school/student[@no="2"]' -t elem -n "student" xmlfile
在最后一个学生之后添加新学生。它产生:
<school>
<student no="1"/>
<student no="2"/>
<student/>
<teacher no="t1"/>
<teacher no="t2"/>
</school>
您也可以在第一个<teacher>
元素之前插入它,例如:
xmlstarlet ed \
--omit-decl \
-i '/school/teacher[preceding-sibling::*[1][self::student]]' \
-t elem \
-n "student" \
xmlfile
产生相同的结果:
<school>
<student no="1"/>
<student no="2"/>
<student/>
<teacher no="t1"/>
<teacher no="t2"/>
</school>