Java 使用StAX保留XML布局(属性顺序、换行符)以进行小的更改(例如更改属性)

Java 使用StAX保留XML布局(属性顺序、换行符)以进行小的更改(例如更改属性),java,xml-parsing,stax,Java,Xml Parsing,Stax,我试图使用StAX迭代器API替换SVG文件中某些属性的值。我使用XMLEventReader读取原始文件,检查并修改元素,然后写入XMLEventWriter 我的原始文件具有以下结构: <?xml version="1.0" encoding="UTF-8"?> <!-- ... --> <!DOCTYPE ... ... ]> <svg ... VTD-XML(一个开源项目,我是其作者)是JavaAPI,它在导出XML树的层次结构时,在解析后保

我试图使用StAX迭代器API替换SVG文件中某些属性的值。我使用
XMLEventReader
读取原始文件,检查并修改元素,然后写入
XMLEventWriter

我的原始文件具有以下结构:

<?xml version="1.0" encoding="UTF-8"?>
<!--
...
-->
<!DOCTYPE ...
...
]>
<svg ...


VTD-XML(一个开源项目,我是其作者)是JavaAPI,它在导出XML树的层次结构时,在解析后保留底层字节。。。这意味着您可以原位替换字节的任何部分,而不会对文档的不相关部分进行任何不必要的篡改。。甚至直接覆盖字节。。。VTD-XML(一个开源项目,我是该项目的作者)是一个零开销的java API,它在导出XML树的层次结构时保留解析后的底层字节。。。这意味着您可以原位替换字节的任何部分,而不会对文档的不相关部分进行任何不必要的篡改。。甚至直接覆盖字节。。。在涉及更新属性的情况下,由于开销为零,最好的选择不是使用
XMLEventWriter
,而是在XML文件中查找标记的位置(字符偏移量)并进行子字符串替换。您可以这样做:

  • 使用
    XMLEventReader
    ,遍历文件
  • 当遇到要更改属性的元素时,使用,然后对其调用
    getCharacterOffset()
    ,这将返回原始文件中发出此事件的位置
  • 通过跟踪以前和当前元素的偏移量,可以从原始文件的内容中提取仅包含一个元素的子字符串
  • 更新子字符串,将其前后的文本连接起来,这将得到一个更新后的XML字符串。由于提取的子字符串只包含一个元素,因此可以安全地假定所有属性都是唯一的,因此可以根据需要添加、删除和更新它们,而无需担心意外接触其他元素
  • 将更新的内容作为字符串写入文件
  • 缺点:您必须手动解析属性,但在大多数情况下这并不重要



    此外,我还发现了
    字符
    事件的一个问题:它们在后续的
    之后报告。在涉及更新属性的情况下,最好的选择不是使用
    XMLEventWriter
    ,而是在XML文件中查找标记的位置(字符偏移量)并进行子字符串替换。您可以这样做:

  • 使用
    XMLEventReader
    ,遍历文件
  • 当遇到要更改属性的元素时,使用,然后对其调用
    getCharacterOffset()
    ,这将返回原始文件中发出此事件的位置
  • 通过跟踪以前和当前元素的偏移量,可以从原始文件的内容中提取仅包含一个元素的子字符串
  • 更新子字符串,将其前后的文本连接起来,这将得到一个更新后的XML字符串。由于提取的子字符串只包含一个元素,因此可以安全地假定所有属性都是唯一的,因此可以根据需要添加、删除和更新它们,而无需担心意外接触其他元素
  • 将更新的内容作为字符串写入文件
  • 缺点:您必须手动解析属性,但在大多数情况下这并不重要



    另外,我发现
    字符
    事件有一个问题:它们在后续
    事件后报告。谢谢你的建议,但我找到了另一个解决方案,在这种特殊情况下有效。谢谢你的建议,但我找到了另一个解决方案,在这种特殊情况下有效。
    
    <?xml version="1.0"?><!--
    ...
    --><!DOCTYPE ...
    ...
    ]><svg ...