动态Xml修改

时间:2014-05-28 09:36:34

标签: xml xml-parsing

我正在开发一个需要动态修改xml文件的项目,这主要涉及在文件中添加新条目(元素/节点)。

但是,有以下注意事项:

  1. 应该可以在特定位置添加新元素(而不仅仅是追加)。
  2. 修改后,文件的序言,注释和格式应保持不变。
  3. 不应执行不必要的字符转义。
  4. 我尝试过使用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(&quot;123&quot;)/>
    

    是否有其他解析器或XML脚本/查询语言可以允许我修改XML文档并提供上述功能?

1 个答案:

答案 0 :(得分:0)

您可以使用更具体的表达式来实现它,例如:

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>