保留所有空格,属性排序,引号,CDATA,命名空间等的XML解析器

时间:2018-06-15 12:28:52

标签: java xml parsing xml-parsing

我的要求是:

  • 从客户端
  • 接收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头,它不在输入中,它已删除CDATA部分,它已重新排序child元素中的属性以及用双引号替换单引号引号。那里有一个Java库可以做我想做的事情,还是应该自己编写?

1 个答案:

答案 0 :(得分:0)

不,我没有注意到这样的解析器。可能有内部解析器嵌入在XML编辑工具中,但我认为它们太紧密耦合,无法普遍使用。

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

PS:管理试图对您施加不良工程的客户是从未出现在简历中的重要IT技能之一......