Как исправить регулярное выражение, чтобы удалить xml нотацию перед каждым элементом? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть xml в строке - формат выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<User>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
</User>

Но каждый элемент имеет <?xml version="1.0" encoding="UTF-8" standalone="yes"?> строку раньше.

Как с помощью регулярных выражений удалить эту дополнительную строку, но чтобы сохранитьпримечание под всем контейнером, как это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<User>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
</User>

Я пытался использовать

public static String removeExtraMetadata(String xml, String tag){        
       return  xml.replaceAll("(?s)<?xml version=\"1.0\" encoding=\"UTF-8\" 
                         standalone=\"yes\"?>.*?", "");
    }
public static String removeExtraMetadata(String xml, String tag){
return xml.replaceAll("(?s)<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>.*?" + tag, tag);
    }

, но у меня этот способ не работает ..

Пробовал на путь

 public static String removeExtraMetadata(String xml){
       return  xml.replaceAll("^\\s+<\\?xml\\s+version=\"1.0\".*\\n", "");
 }

но результат по-прежнему неверен.

1 Ответ

0 голосов
/ 23 февраля 2019

Вы можете использовать это регулярное выражение, чтобы соответствовать строке, которую вы хотите удалить из вашего xml,

^\s+<\?xml\s+version="1.0".*\n

Здесь ^\s+ гарантирует, что первая строка не соответствует той, которую желательно сохранить встроки файла и остатка, начинающиеся с <?xml version="1.0", удаляются, поскольку остальные из них начинаются с некоторого пробела.

и заменяют его пустой строкой,

Demo

Проверьте этот код Java,

String s = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<User>\n"
        + "    <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "    <User>\n"
        + "        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>\n" + "    </User>\n"
        + "    <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "    <User>\n"
        + "        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>\n" + "    </User>\n"
        + "</User>";

System.out.println("Before: " + s);
System.out.println("After: " + s.replaceAll("\\s+<\\?xml\\s+version=\"1.0\".*", ""));

Он печатает это там, где удаляет строки, которые вы хотели удалить,

Before: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<User>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
</User>
After: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<User>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
    <User>
        <objectId>c33edcd9-5c13-4ceb-a81a-0a8f44b813ed</objectId>
    </User>
</User>

Используйте регулярное выражение из моего JavaПримеры кода, я немного изменил, чтобы настроить для Java и строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...