【问题标题】:java StAX parser: not preserving double quotes for attributesjava StAX解析器:不保留属性的双引号
【发布时间】:2018-07-26 09:30:04
【问题描述】:

StAX 解析器正在将属性周围的双引号转换为XMLEventReader 使用的数据模型中的单引号。这很好,但如果我想打印回 XML,也许只选择原始 XML 的片段,输出将不一样。

输入文件:

<root>
  <mySubTrees>
    <mySubTree>
      <a property="target">
        <aa>123</aa>
      </a>
      <b>456</b>
      <c>789</c>
    </mySubTree>
  </mySubTrees>
</root>

代码:

@Test
public void test_getXmlFragment() throws Exception {
  byte[] fileContent = getXMLBytes();
  String xmlFragment = "";

  XMLInputFactory factory = XMLInputFactory.newInstance();
  XMLEventReader eventReader = factory.createXMLEventReader(new ByteArrayInputStream(fileContent));
  while (eventReader.hasNext()) {
    XMLEvent event = eventReader.nextEvent();
    xmlFragment += event;
  }

  System.out.println(xmlFragment);
}

private byte[] getXMLBytes() throws IOException {
  InputStream inputStream = this.getClass().getResource(PREFIX_XML_FILES + "/sss.xml").openStream();
  byte[] fileContent = new byte[inputStream.available()];
  inputStream.read(fileContent);
  inputStream.close();
  return fileContent;
}

输出:

<?xml version="null" encoding='UTF-8' standalone='no'?>
<root>
    <mySubTrees>
        <mySubTree>
            <a property='target'>
                <aa>123</aa>
            </a>
            <b>456</b>
            <c>789</c>
        </mySubTree>
    </mySubTrees>
</root>

期望的输出:

<?xml version="null" encoding="UTF-8" standalone="no"?>
<root>
    <mySubTrees>
        <mySubTree>
            <a property="target">
                <aa>123</aa>
            </a>
            <b>456</b>
            <c>789</c>
        </mySubTree>
    </mySubTrees>
</root>

有什么办法可以微调吗?

【问题讨论】:

    标签: java xml attributes stax


    【解决方案1】:

    没有。单引号和双引号包裹的属性没有区别,要求两者区别是不合理的要求。

    StAX 的工作不是保留它正在读取的 XML 文件语法。 StAX 是一个解析器,它的工作是中继它正在读取的 XML 中表示的数据模型。它完美地完成了这项工作。

    像您这样的需求可能会迫使您编写自己的 XML 库,因为您一开始就不应该有这个需求。

    【讨论】:

    • 不幸的是,读取这些文件的系统需要双引号,我不得不求助于使用 xslt 和 模板来解决这个问题,即保留前后的语法解析。有没有更好的办法?基本上我需要做的就是:1)读取 xml 文件 2)将其拆分 - 在某些父节点下每个子树一个文件谢谢
    • @w.l. XSLT 能够做到这一点很奇怪,但如果目标是使用双引号,而不是保留与原始引号相同的引号,那么您可以使用任何 XML 输出技术并指示它放置双引号围绕属性。它通常是一个可用的美容功能。不过,正如我所说,这是一个不合理的要求,没有专业的工具链会鼓励你这样做。如果您可以破解它并且它是安全的,那么这是最有效的做法。否则,您所能做的就是编写自己的工具。
    • -1 因为这个问题的答案没有意义。它指出了为什么StAX 不满足 reflective 属性的问题。从在属性上使用双引号的 XML 文档中读取,如果再次打印回 XMLEventReader,它将以单引号打印。而且似乎没有办法告诉 XMLEventReader 使用双引号。我认为StAX 做得很好,但是能够生成相同的初始xml 的要求也不错。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2023-03-24
    相关资源
    最近更新 更多