【问题标题】:Regex - Unformat XML正则表达式 - 取消格式化 XML
【发布时间】:2021-01-16 21:04:15
【问题描述】:

我正在尝试将 XML 取消格式化为单行。 (使用 JAVA)

我尝试使用以下正则表达式来替换。

input.replaceAll(">\\s+", ">").replaceAll("\\s+<", "<");

但是,它也会删除元素前后的空间。 这是出乎意料的。

例如:

场景01

之前:&lt;AAA&gt;{space}{space}{space}&lt;/AAA&gt;

之后:&lt;AAA&gt;&lt;/AAA&gt;

场景02

之前:&lt;AAA&gt;{space}{space}123{space}{space}&lt;/AAA&gt;

之后:&lt;AAA&gt;123&lt;/AAA&gt;

场景 03

之前:&lt;AAA&gt;{space}A{space}B{space}C{space}&lt;/AAA&gt;

之后:&lt;AAA&gt;A{space}B{space}C&lt;/AAA&gt;

有没有办法取消格式化并避免上述情况?

【问题讨论】:

  • 不相关。 OP 要求通过替换换行符来重新格式化 XML,而不是解析任何内容。这非常可以使用正则表达式。
  • 使用正则表达式处理 XML 总是很危险的。每次都使用 XML 解析器要好得多。

标签: java regex xml indentation


【解决方案1】:

撒克逊解决方案:

Processor p = new Processor(false);
DocumentBuilder db = p.newDocumentBuilder();
db.setWhitespaceStrippingPolicy(WhitespaceStrippingPolicy.ALL);
XdmNode doc = db.build(new File(...));
Serializer s = p.newSerializer(new File(...));
s.serialize(doc.asSource());

通过在 Serializer 对象上设置属性,您可以对输出格式进行相当多的控制。

【讨论】:

    【解决方案2】:

    这将替换标签结束和前面标签开始之后的垂直空格,例如"\n"、"\r" 或组合等。

    input.replaceAll(">\\v+", ">").replaceAll("\\v+<", "<");
    

    摘自https://www.regular-expressions.info/shorthand.html 说:

    \v 匹配“垂直空白”,其中包括在 Unicode 标准中被视为换行符的所有字符。与[\n\cK\f\r\x85\x{2028}\x{2029}]相同。

    【讨论】:

      猜你喜欢
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多