2011-04-24 3 views
2

의사 XML 형식으로 제공되는 파일에서 텍스트를 구문 분석하려고합니다. 그것은 다음과 같은 구조로 오면 내가 그것에서 DOM 문서를 얻을 수 있습니다 :Java에서 의사 XML 파일 구문 분석

<product> 
    <product_id>234567</product_id> 
    <description>abc</description> 
    <quantity 1:2> 
     <version>1.1</version> 
    </quantity 1:2> 
     <version>1.2</version> 
    <quantity 2:2> 
    </quantity 2:2> 
</product> 

그것은 생성 구조는 다음과 유사 할 때 내가 실행 해요 문제가 발생

<product> 
    <product_id>234567</product_id> 
    <description>abc</description> 
</product> 

<quantity 1:2>의 공간으로 인해 다음과 같은 예외 :

org.xml.sax.SAXParseException:[Fatal Error] :1:167: Element type " quantity " must be followed by either attribute specifications, ">" or "/>" 

나는 밑줄 공간을 대체하면이 문제를 해결할 수 있습니다. 문제는 구조가 크기가 다를 수 있으며 동일한 형식 (<node 1:x>)의 여러 하위 노드가 포함되어 있으며 파일에 구문 분석 할 수있는 구조가 수백 개 포함될 수 있다는 것입니다. 이 같은 텍스트를 파싱 할 수있는 클래스가 트리와 같은 객체를 반환합니까?

답변

1

그것은 인해이 오류의 근본 원인없는 <quantity 1:2>

의 공간에 다음과 같은 예외를 생성, 사람들이 이미 언급 한 바와 같이 근본 원인이있다, 파일 형식이 잘못되었습니다 XML. 유효한 XML 태그는 <quantity attr1="val1" attr2="val2>입니다.

파일 형식을 제어 할 수없는 것 같습니다. 이 경우 내가 유효한 XML로 파일이 다음 DOM을 가지고있는 가장 쉬운 방법은 전처리 생각/SAX 파서는 구문 분석 :이 코드를 테스트 않으며 최적화하지 않았다

FileInputStream file = new FileInputStream("pseudo.pxml"); 
ByteArrayOutputStream temp = new ByteArrayOutputStream(); 
int c = -1; 

while ((c=file.read()) >= 0){ 
    temp.write(c); 
} 

String xml = new String(temp.toByteArray()); 
xml = xml.replaceAll("([^:\s]+:[^:\s]+)", "value=\"\\1\""); 

ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.getBytes()); 

/* use xmlIn for your XML parsers */ 

참고; 단지 당신에게 아이디어를주고 싶었습니다.

+0

파일을 유효한 XML로 사전 처리하는 클래스를 만들었습니다. – Mane

4

파일을 사전 처리하고 해당 x : y 형식의 요소를 <element value="x:y"/>으로 변경하면 DOM/SAX 파서가 질식하지 않습니다.

that way leads to madness을 돕기 위해 정규 표현식을 사용하는 것이 좋습니다.

4

파일은 전혀 XML 아니며, SAX는 XML (XML에 대한 간단한 API)입니다. 구조를 다시 생각하여 다음과 같이 할 수 있도록하십시오 :

<quantity myAttr="1.2"> 
    <version>1.2</version> 
</quantity> 
<quantity myAttr="1.x"> 
    <version>1.1</version> 
</quantity> 
<version>1.0</version> 

또는 이와 비슷한 것입니다.