【问题标题】:" is auto converting to " through Document & Transformer API“通过 Document & Transformer API 自动转换为”
【发布时间】:2021-04-01 19:10:51
【问题描述】:

我正在通过org.w3c.dom.Document 加载xml 文件(pom.xml)并通过javax.xml.transform.Transformerjavax.xml.transform.TransformerFactory 编辑某些节点的值(基本上是更改某些依赖项的版本值) &javax.xml.transform.dom.DOMSource.

但问题是,这也会将所有出现的 " 转换为 " 字符,这是我不想要的。请参见下面的示例:

<Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version=&quot;${project.version}&quot;</Export-Package>

转换为:

<Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version="${project.version}"</Export-Package>

请帮助解决这个问题,如何使用当前使用的 API 忽略这些自动转换。

代码示例:

public void writeDocument(File filePath)
{
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    this.thisDoc.getDocumentElement().normalize();
    Transformer transformer;
    try
    {
        transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(thisDoc);
        StreamResult result = new StreamResult(filePath);
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(source, result);
    }
    catch (TransformerException e)
    {
        VersionUpdateExceptions.throwException(e, LOG);
    }
}

【问题讨论】:

  • 为什么会出现这个问题?
  • 我们正在开发一些用于版本升级的实用程序,除了版本升级之外,不希望进行任何无关的更改。
  • 但这只会发生一次;发生此转换后,所有后续更新都会进行预期的最小更改。
  • 你能发布更新的代码吗?
  • 添加了代码示例。

标签: java dom java-8 xml-parsing domdocument


【解决方案1】:

这是Document Object Model (DOM) Level 3 Load and Save Specification 要求的行为:

在文档的字符数据中(标记之外),任何 无法直接表示的字符被替换为 字符参考。 '其他预定义实体 (>、' 和 ") 可能不会使用,除非需要 (例如,在 ']]>' 等情况下使用 >)。

例如,如果您在属性中使用&amp;quot;

<Export-Package id="&quot;test&quot;">

&amp;quot; 将被保留。否则不会。

如果绝对必要,您可以通过丑陋的 hack 来实现“””的保留。

  • pom.xml 读取为String 并将&amp;quot; 的出现替换为一些“标记”字符串
  • 要解析文档,请使用StringReader 创建InputSource
  • 执行您的方法,但使用StringWriter 创建一个StreamResult
  • StringWriter 获取内容作为String 并将您的标记字符串替换为&amp;quot;
  • 将内容保存到文件中

【讨论】:

  • 不能采用建议的方法“”测试“”,只是看看我如何可以忽略这个替换而不对源 pom.xml 进行任何更改。任何方式感谢您详细说明。
猜你喜欢
  • 2011-01-18
  • 2019-04-29
  • 2021-06-01
  • 2012-10-28
  • 2015-10-01
  • 2018-02-21
  • 2021-12-07
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多