Java разделяет строку xml, содержащую несколько файлов xml, сохраняя шаблон

В настоящее время я работаю со строкой XML (все данные XML хранятся в строке XML), которая состоит из нескольких файлов 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\"?>)");

Однако ничего не случилось, когда я это сделал. Что я здесь не так делаю?

Спасибо за помощь!

1 ответ

Вам просто нужно убежать от ? персонаж, добавив \\ перед этим. Это происходит для всех специальных символов, которые имеют некоторое значение в регулярном выражении. Так что вам нужно иметь \\ в качестве префикса, когда вы хотите использовать специальные символы в качестве простых строковых символов.

Следующий фрагмент кода работает.

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 за указание на это.

Другие вопросы по тегам