gpt4 book ai didi

java - XML 解析器保留所有空白、属性排序、引号、CDATA、命名空间等

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:04 24 4
gpt4 key购买 nike

我的要求是:

  • 接收来自客户端的XML文档
  • 翻译某些 XML 元素和属性(根据预定义的规则)
  • 写出翻译后的 XML 文档
  • 将XML文档返回给客户端

除了所需的翻译之外,不得以任何方式修改 XML 文档。这是客户的要求 - 当他们对其 XML 文件进行更改时,这是由人工完成的,并且人工希望 XML 格式看起来像某种方式。

是否有 XML 解析器可以执行此操作?下面是一个使用 StAX 解析器但不保留输入 xml 的某些部分的简单示例:

XML 输入:

<item>
<!-- Comment for title -->
<title>Title of Feed Item</title>
<link>/mylink/article1</link>
<description>
<![CDATA[
<p>Paragraph of text describing the article to be displayed</p>
]]>
</description>
<!-- Comment for nested item -->
<parent>
<child title="translatable attribute" foo='non translatable attr'>
Translatable text
</child>
</parent>
</item>

StAX 解析器代码:

@Test
public void testXmlParser() throws IOException, XMLStreamException {

String xmlSource = IOUtils.toString(new FileInputStream("testsamples/example.xml"), "UTF-8");

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader =
factory.createXMLEventReader(new StringReader(xmlSource));

Writer outputWriter = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
XMLEventWriter xmlEventWriter = xmlOutputFactory
.createXMLEventWriter(outputWriter);

while(eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
xmlEventWriter.add(event);
}

//Assertion is false
assertEquals(xmlSource, outputWriter.toString());
}

StAX 事件编写器的输出:

<?xml version="1.0" ?><item>
<!-- Comment for title -->
<title>Title of Feed Item</title>
<link>/mylink/article1</link>
<description>

&lt;p&gt;Paragraph of text describing the article to be displayed&lt;/p&gt;

</description>
<!-- Comment for nested item -->
<parent>
<child foo="non translatable attr" title="translatable attribute">
Translatable text
</child>
</parent>
</item>

如您所见,输出包含输入中没有的 XML header ,它删除了 CDATA 部分,对 child 元素中的属性重新排序,并将单引号替换为双引号。是否有一个 Java 库可以实现我想要的功能,或者我应该编写自己的库?

最佳答案

不,据我所知,没有这样的解析器。 XML 编辑工具中可能嵌入了内部解析器,但我认为它们耦合得太紧密,无法通用。

您不应该关心属性是否由单引号或双引号分隔,或者“=”符号周围是否有空格,或者 UTF-8 编码中的 1 位是否由正电压或负电压表示,因此解析器不会告诉您。如果您确实关心,那么您可能做错了:成功的软件工程取决于对您正在使用的抽象层的理解。

PS:管理那些试图将糟糕的工程强加给你的客户是简历中从未出现过的重要 IT 技能之一......

关于java - XML 解析器保留所有空白、属性排序、引号、CDATA、命名空间等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50875640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com