StAX를 사용하려고합니다. (이미 싫어합니다 ....)
사용하는 유일한 방법은 if-else 조건 연속입니다.
가장 중요한 것은 미리 구문 분석되는 XML 문서의 구조를 미리 알지 못하는 한 요소를 자식과 연관시킬 수있는 방법이 없다는 것입니다. 정확합니까? 나는 다음과 같은 시도
: 나는 문자열이 XML을java StAX를 사용하여 일반 요소로 자식 요소를 가져옵니다.
<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\">
<ns1:A/>
<ns1:B>
<Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<Data>
<Author>John</Author>
<Edition>1</Edition>
<PubHouse>Small Publishing House</PubHouse>
<Price>37.8</Price>
</Data>
</Book>
</ns1:B>
</ns1:Root>
내가 책 요소를 얻을 경우 StAX를 사용하고자하지만 난 단지 모든 구조를 하드 코딩 코드를 작성할 수 있습니다 보인다.
즉, XMLEventReader를 사용하고 나서 을 예약하면 데이터, 제작자 등을 위해 루핑을 시작하십시오.
여기에 일반적인 해결책이 있습니까?
다음과 같이 arround를 얻으려고 시도했습니다. String에서 XMLEventReader로 이동하여 String으로 돌아가려고했지만 원래 사용했던 정확한 String 표현을 얻을 수 없습니다 (네임 스페이스는 대괄호, 여분의 콜론 등).
<?xml version="1.0" encoding='UTF-8' standalone='no'?><['http://rootNameSpace.com/']:ns1:Root xmlns:ns1='http://rootNameSpace.com/'><['http://rootNameSpace.com/']:ns1:A></ns1:A><['http://rootNameSpace.com/']:ns1:B><['http://www.myNameSpace.com']::Book xmlns:='http://www.myNameSpace.com' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><['http://www.myNameSpace.com']::Data><['http://www.myNameSpace.com']::Author>John</Author><['http://www.myNameSpace.com']::Edition>1</Edition><['http://www.myNameSpace.com']::PubHouse>Small Publishing House</PubHouse><['http://www.myNameSpace.com']::Price>37.8</Price></Data></Book></ns1:B></ns1:Root>
이 경우는 유일한 솔루션입니다 StAX를하거나 DOM을 통해 해결 될 수 :
StringBuilder xml = new StringBuilder();
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
String msg = "<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\"><ns1:A/><ns1:B><Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Data><Author>John</Author><Edition>1</Edition><PubHouse>Small Publishing House</PubHouse><Price>37.8</Price></Data></Book></ns1:B></ns1:Root>";
InputStream input = new ByteArrayInputStream(msg.getBytes("UTF-8"));
XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext())
{
XMLEvent event = xmlEventReader.nextEvent();
StringWriter sw = new StringWriter();
event.writeAsEncodedUnicode(sw);
xml.append(sw);
}
System.out.println(xml);
나는 다음과 같은거야?
@gustafc : 게시 한 코드로 요소가 시작된다는 것을 알았습니다.이 요소의 모든 자식을 어떻게 가져올 수 있습니까? DOM은 사소한 것입니다. StAX에서 어떻게합니까? – Cratylus
글쎄, 모든 이벤트를 요소의 "내부"로 가져 오려면 START_ELEMENT 이벤트보다 하나 더 END_ELEMENT를 찾을 때까지 이벤트를 읽어야합니다. 그러나 그것은 끔찍한 DOMish 방식입니다. 실제로하고 싶은 것은 반복적 인 하향 파서입니다. 각 파서는 각 요소를 읽고이를 즉시 일부 도메인 객체로 변환합니다. 진절머리 나는 설명에 대해 유감스럽게 생각하지만 StAX를 효과적으로 사용하는 것을 배우는 것은 실제로 대부분 DOM 중독을 유발하는 문제입니다. – gustafc
@gustafc : 나는 상상했다. "재귀 적 파서 파서"라고 말하면 StAX를 사용하지 않는다는 뜻인가요? StAX는 "해킹"을 사용하지 않고 이것을 제공하지 않습니까? – Cratylus