2016-05-09 1 views
2

У меня есть строка, содержимое которой является XML. Я хочу разделить теги и превратить их в список строк в Java. Ниже то, что я пытаюсь:Разбирайте строку XML и создайте список строк

string xml="<hello><hi a='a' b='b'/><hi a='b' b='a'/></hello>"; 

Я хочу, чтобы разделить его в список, как:

list[0]="<hi a='a' b='b'/>" 
list[1]="<hi a='b' b='a'/>" 

Я пытался сделать это с помощью процессора JAXB, но не очень хорошо работает. Также попробовал какую-то глупую логику с помощью split, но это тоже не помогло. Есть ли другой способ достичь этого?

+0

Попробуйте использовать Java SAX для синтаксического анализа XML – dumitru

+1

Что вы имеете в виду _ «не работает» _? Пожалуйста, объясните свою конечную цель и предоставите больше контекста, чтобы мы могли помочь вам лучше. т. е. после того, как вы отделите XML от того, что вы собираетесь с ним делать? Не совсем ясно, что полноразмерный синтаксический анализ XML - это то, что вам нужно здесь. –

ответ

1
string xml="<hello><hi a='a' b='b'/><hi a='b' b='a'/></hello>"; 

//read XML from the given string 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputSource is = new InputSource(new StringReader(xml)); 
Document doc = builder.parse(is); 

//this will return a list of xml tags whose name is `hi` 
NodeList hiList = document.getElementsByTagName("hi"); 

//you can iterate over hiList and read/process them 
for (int i = 0; i < hiList.getLength(); i++) { 
    Node child = hiList.item(i); 
    String name = child.getNodeName(); 
    String contents = child.getTextContent(); 
} 
0

Хотя это немного неясно, что вы пытаетесь достичь, я не пошел бы на полномасштабный парсер XML в вашем случае. С помощью стандартных парсеров DOM, SAX или Stax вам необходимо будет повторно создать свои элементы (например, атрибуты) или использовать Transformer.

Простой regex, кажется, самое простое решение здесь:

String xml = "<hello><hi a='a' b='b'/><hi a='b' b='a'/></hello>"; 
String[] es = xml.split("(?=<)|(?<=>)"); 
List<String> result = new ArrayList<>(es.length); 
for (int i = 0; i < es.length; i++) { 
    // do not add first and last element ("hello" in your example) 
    if (i > 0 && i < es.length - 1) 
     result.add(es[i]); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^