【问题标题】:Java split xml string containing multiple xml files while keeping the patternJava拆分包含多个xml文件的xml字符串,同时保持模式
【发布时间】:2016-12-28 19:48:10
【问题描述】:

我目前正在处理一个由多个 XML 文件组成的 XML 字符串(所有 xml 数据都存储在 String xml 中):

<?xml version="1.0" encoding="UTF-8"?>
<File xml:space="preserve">
     <Subfile keyword="Store" tag="0">
          <Value number="1">Amazon</Value>
     </Subfile>
     <Subfile keyword="Owner" tag="1">
          <Value number="1">Alice Murphy</Value>
     </Subfile>
     <Subfile keyword="Date" tag="2">
          <Value number="1">20161114</Value>
     </Subfile>
</File>

<?xml version="1.0" encoding="UTF-8"?>
<File xml:space="preserve">
     <Subfile keyword="Store" tag="0">
          <Value number="1">Walmart</Value>
     </Subfile>
     <Subfile keyword="Owner" tag="1">
          <Value number="1">Eliza Calvin</Value>
     </Subfile>
     <Subfile keyword="Date" tag="2">
          <Value number="1">20161130</Value>
     </Subfile>
</File>
...

我想根据 xml 标签使用 String.split() 拆分这个 xml 字符串。

我还希望数组的结果元素保留充当分隔符的 xml 标记。

我使用的代码是

String[] xmls = xmlString.split("(?=<?xml version=\"1.0\" encoding=\"UTF-8\"?>)");

但是,当我这样做时,什么也没发生。我在这里做错了什么?

感谢您的帮助!

【问题讨论】:

  • 你没有转义特殊字符。
  • 另外,什么都没发生并不是一个很有用的问题描述。
  • 使用Pattern.quote() 转义模式

标签: java xml string split


【解决方案1】:

您只需在 ? 字符前添加 \\ 即可对其进行转义。它发生在所有在正则表达式中具有某些含义的特殊字符上。因此,当您想将特殊字符用作简单字符串字符时,您需要将\\ 作为前缀。

以下代码 sn-p 有效。

String separator = "(?=<\\?xml version=\"1.0\" encoding=\"UTF-8\"\\?>)";
String[] xmls = xmlString.split(separator);
for (String xml : xmls) {
    System.out.println(xml);
    System.out.println("-----------------------------------");
}

打印出来:

<?xml version="1.0" encoding="UTF-8"?>
<File xml:space="preserve">
     <Subfile keyword="Store" tag="0">
          <Value number="1">Amazon</Value>
     </Subfile>
     <Subfile keyword="Owner" tag="1">
          <Value number="1">Alice Murphy</Value>
     </Subfile>
     <Subfile keyword="Date" tag="2">
          <Value number="1">20161114</Value>
     </Subfile>
</File>


-----------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<File xml:space="preserve">
     <Subfile keyword="Store" tag="0">
          <Value number="1">Walmart</Value>
     </Subfile>
     <Subfile keyword="Owner" tag="1">
          <Value number="1">Eliza Calvin</Value>
     </Subfile>
     <Subfile keyword="Date" tag="2">
          <Value number="1">20161130</Value>
     </Subfile>
</File>
-----------------------------------

编辑. 应转义如下。

String separator = "(?=<\\?xml version=\"1\\.0\" encoding=\"UTF-8\"\\?>)";

感谢@shmosel 指出这一点。

【讨论】:

  • 完美运行。很高兴得知“?”在这种情况下需要“//”。谢谢。
  • . 也需要转义。
  • @shmosel 你是对的,. 也是一个特殊字符。也许我的代码正在工作,因为. 在引号之间!不过不确定。
  • 它工作正常,因为. 匹配任何字符,包括.
  • 在 XML 上使用正则表达式总是令人不安。当然,这不是一个有效的 XML 文件。请注意,XML 中的任何 CDATA 部分都可能导致此失败,即 ]]> 极不可能,但并非闻所未闻; )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多