Java 使用StAX保留XML布局(属性顺序、换行符)以进行小的更改(例如更改属性)
我试图使用StAX迭代器API替换SVG文件中某些属性的值。我使用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树的层次结构时,在解析后保
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 ...