Как получить несколько подстрок одного индекса? - PullRequest
2 голосов
/ 17 октября 2019

Я хочу извлечь каждую область между <xsd:headerName> и </xsd:headerName>. Поскольку я пишу генератор кода, я не могу определить, как часто он присутствует, потому что он может отличаться для каждого xml.

Я просто получаю нулевые указатели при выполнении, так что я делаю неправильно?

Без списка я получаю первую область, но мне нужны все из них по отдельности.

     String xmlToString = null;
     List<String> ComplexTypeList = null;
     String path = "/path/of/xml";
            try {
                xmlToString = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);

            } catch (IOException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < headerName.size(); i++) {

                String result = xmlToString.substring(xmlToString.indexOf("<xsd:headerName"), xmlToString.indexOf("</xsd:headerName>") + 18); // +18 so i get </xsd:headerName>
                ComplexTypeList.add(result); // here i get a Nullpointer
            }

РЕДАКТИРОВАТЬ: Итак, теперь, когда это почти работает, у меня все еще есть проблема, что он всегда занимает одну и ту же / первую область. Как я могу решить это, чтобы он всегда переходил к следующему?

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Вы можете использовать регулярное выражение вместо ручного поиска в String:

String str = "<xsd:headerName>  Hello</xsd:headerName><xsd:headerName>World</xsd:headerName><xsd:headerName> and </xsd:headerName>";
Matcher matcher = Pattern.compile("<xsd:headerName>[\\s\\S]*?</xsd:headerName>").matcher(str); // regex pattern

До Java 9: ​​

List<String> result = new ArrayList<>();
while(matcher.find()) {
    result.add(matcher.group());
}

После Java 9: ​​

List<String> result = matcher.results().map(MatchResult::group).collect(Collectors.toList());

Печать result:

result.forEach(System.out::println);

Вывод:

<xsd:headerName>  Hello</xsd:headerName>
<xsd:headerName>World</xsd:headerName>
<xsd:headerName> and </xsd:headerName>
1 голос
/ 17 октября 2019

Вы действительно не хотите обрабатывать XML, используя манипуляции со строками. Вам нужен правильный синтаксический анализатор XML, чтобы превратить его в некоторую структуру данных, которую вы затем сможете запрограммировать. По сути, если вы делаете это с помощью обработки строк, то ваш код неизбежно потерпит неудачу при некоторых допустимых входных данных. Это может не иметь значения для одноразового специального процесса, но вы, в частности, говорите, что «все может быть по-разному с каждым xml», поэтому вам явно нужно что-то более надежное.

Мой предпочтительный подход всегда заключается в использованииспецифичный для XML язык (XPath, XSLT, XQuery), но если вы хотите использовать Java, то анализируйте XML в древовидную структуру (я бы порекомендовал JDOM2 или XOM, но многие люди продолжают использовать старый и неуклюжийDOM, поставляемый с JDK), а затем перейдите к этой древовидной структуре.

0 голосов
/ 17 октября 2019

Попробуйте объявить список как:

List<String> ComplexTypeList = new ArrayList<String>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...