我的要求是:
除了所需的翻译之外,不得以任何方式修改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>
<p>Paragraph of text describing the article to be displayed</p>
</description>
<!-- Comment for nested item -->
<parent>
<child foo="non translatable attr" title="translatable attribute">
Translatable text
</child>
</parent>
</item>
正如您所看到的,输出包含一个XML头,它不在输入中,它已删除CDATA部分,它已重新排序child
元素中的属性以及用双引号替换单引号引号。那里有一个Java库可以做我想做的事情,还是应该自己编写?
答案 0 :(得分:0)
不,我没有注意到这样的解析器。可能有内部解析器嵌入在XML编辑工具中,但我认为它们太紧密耦合,无法普遍使用。
您不应该关心属性是由单引号还是双引号分隔,或者“=”符号周围是否有空格,或者UTF-8编码中的1位是由正数还是负数表示电压,所以解析器不会告诉你。如果你关心,那么你可能做错了:成功的软件工程依赖于理解你正在使用的抽象层。
PS:管理试图对您施加不良工程的客户是从未出现在简历中的重要IT技能之一......