Porównaj ceny domen i usług IT, sprzedawców z całego świata

Parser, aby analizować nieznany schemat XML w Javie


Próbowałem zrozumieć wszystkie inne odpowiedzi na temat stackoverflow. Ale nie mogę powiązać tych odpowiedzi z moim pytaniem.
Kiedy dzwonię do usługi sieciowej, otrzymuję
odpowiedź
. Otrzymuję schemat do
response.getData (); (XML tabeli danych zawierającej wyniki.)
(zwracany typ String)
. Nie wiemy, jakie dane otrzymujemy w tym XML-u.
Muszę użyć parsera trzeciego, gdy podaję powyższy ciąg do jednej metody w tym parseru, musi zwrócić wszystkie elementy w tym XML, a następnie mogę wydrukować niezbędne elementy.
Nie chcę rozpocząć analizy samego XML. Czy istnieje sposób na to? (Czy w tym istnieje jakieś znaczenie?). Przepraszam, jeśli jestem całkowicie się mylący. (Korzystanie z
Axis2/Eclipse
) (Edytowane)
Edytuj: Dodawanie kodu, który już próbowałem.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
NodeList nodeList = null;
try {
String xml = res2.getResult().getRawData();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new ByteArrayInputStream(xml.getBytes()));
nodeList = document.getElementsByTagName("PhoneNumber");
NamedNodeMap attrib = document.getAttributes();
for (int i = 0; i < attrib.getLength(); i++) {
String nodeName = attrib.item(i).getNodeName();
//nodeName
String nodeValue = attrib.item(i).getNodeValue();
}

Ale nie jestem pewien, jaki jest numer telefonu z tym tagiem lub inną nazwą. Nie wiemy też, ile mamy tagów.
Dziękujemy za korzystanie z kodu z Syams, mogę wydrukować wszystkie węzły i odpowiednie wartości z XML. Teraz chcę go zapisać w Hashmapu z kluczem jako nazwę węzła i wartości węzła na liście.
Przykład XML:
<Docs>
<Doc>
<Id>12</Id>
<Phone>1234</Phone>
</Doc>
<Doc>
<Id>147</Id>
<Phone>12345</Phone>
<Locked>false</Locked>
<BID>2</BID>
<DocId>8</DocId>
<Date>2014-02-04T12:18:50.063-07:00</Date>
<Urgent>false</Urgent>
</Doc>
</Docs>

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W tym celu nie musisz szukać biblioteki innej firmy. możesz po prostu zidentyfikować wszystkie węzły liści za pomocą xpath i odczytać wartość (jak również atrybuty). na przykład
public static Map<String, List<String>> parseXml(String xml) throws XMLStreamException {
StringBuilder content = null;
Map<String, List<String>> dataMap = new HashMap<>();
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = new ByteArrayInputStream(xml.getBytes());
XMLStreamReader reader = factory.createXMLStreamReader(stream); while (reader.hasNext()) {
int event = reader.next(); switch (event) {
case XMLStreamConstants.START_ELEMENT:
content = new StringBuilder();
break; case XMLStreamConstants.CHARACTERS:
if (content != null) {
content.append(reader.getText().trim());
}
break; case XMLStreamConstants.END_ELEMENT:
if (content != null) {
String leafText = content.toString();
if(dataMap.get(reader.getLocalName()) == null){
List<String> values = new ArrayList<>();
values.add(leafText);
dataMap.put(reader.getLocalName(), values);
} else {
dataMap.get(reader.getLocalName()).add(leafText);
}
}
content = null;
break; case XMLStreamConstants.START_DOCUMENT:
break;
} } return dataMap;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Powinieneś przeczytać odpowiedzi związane z

Najlepszy parser XML dla Java
https://coderoad.ru/373833/. Przy użyciu przykładu XML

Przykładowy plik XML (books.xml)
https://msdn.microsoft.com/en-us/library/ms762271(v=vs.85).aspx
które pobrałem do folderu tymczasowego na moim dysku C:, możesz użyć natywnej biblioteki Java SAXParser. Oto przykładowa klasa, której możesz użyć do iteracji po wszystkich elementach XML. Utwórz klasę w swoim projekcie i wywołaj jej metodę analizy, na przykład:
File xml = new File("c:/temp/books.xml");
MySaxParser sax = new MySaxParser(xml);
sax.parseXml();

Jest to klasa, którą możesz skopiować do swojego projektu, aby spróbować. Oczywiście zmodyfikuj według własnych potrzeb. Import musi wysłać Ci do odpowiednich stron API Java, takich jak

SAXParser, klasa
http://docs.oracle.com/javase/ ... .html
zacząć.
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class MySaxParser extends DefaultHandler {
private String absolutePathToXml = "";
public MySaxParser(File xml) {
absolutePathToXml = xml.getAbsolutePath();
}
/**
* Parses an XML file into memory
*/
public void parseXml() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(absolutePathToXml, this);
} catch (ParserConfigurationException e) {
System.out.println("ParserConfigurationException: ");
e.printStackTrace();
} catch (SAXException e) {
System.out.println("SAXException: ");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException: ");
e.printStackTrace();
}
}
/**
* Event: Parser starts reading an element
*/
@Override
public void startElement(String s1, String s2, String elementName, Attributes attributes)
throws SAXException {
//print an element's name
System.out.println("element: " + elementName);
//print all attributes for this element
for(int i = 0; i < attributes.getLength(); i++) {
System.out.println("attribute: " + attributes.getValue(i));
}
}
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się