2010-05-09 2 views
3

Java 코드를 자동으로 생성하는 데 사용할 수있는 많은 항목을 포함하는 큰 XML 문서 형식에 대한 DOM 구문 분석기를 이미 작성했습니다. 이는 동적으로 생성 된 Java 소스 파일에 병합되는 작은 표현식으로 제한됩니다.노드 당 사용 가능한 행 번호로 SAX/DOM을 통해 XML을 구문 분석 할 수있는 방법이 있습니까?

지금까지 - 너무 좋았습니다. 모든 것이 작동합니다.

그러나 Java 코드가 포함 된 XML 노드의 행 번호를 포함 할 수 있기를 원합니다 (구성에 호환되지 않는 코드가 포함되어 있으면 각 메소드에 소스 XML 문서에 대한 포인터가 포함될 수 있습니다. 디버깅을 쉽게하기 위해 줄 번호). 구문 분석시 줄 번호가 필요 없으며 XML 소스 문서의 유효성을 검사 할 필요가 없으며 특정 줄 번호에 오류가 발생합니다. 내 DOM 또는 SAX 이벤트마다 각 노드 및 속성의 줄 번호에 액세스 할 수 있어야합니다.

내가 어떻게이 문제를 해결할 수 있을지에 대한 제안 사항이 있으십니까?

P. 또한 StAX에는 파싱하는 동안 줄 번호를 가져 오는 방법이 있지만 이상적으로는 Java 6+ 응용 프로그램이되거나 추가 기능을 사용하는 대신 Java 4/5에서 일반 SAX/DOM 처리와 동일한 결과를 얻고 싶습니다. .jar 파일.

답변

3

아마도 org.xml.sax.Locator?

+0

좋아, 나는 그것을 확인해 보겠습니다. 이 질문은 실제로 1.4/5.0의 기본 SAX 프로세서에서는 가능하지 않다고 말하는 잘못된 정보를 소비 한 것 같습니다. 내가 성공하면 여기서 다시보고 할게. – Chris

+0

고마워, 정확히 내가 무엇을 찾고 있었는지. – jutky

6

에서만 얻을 수있을 것 ... 나는이 스레드 (죄송합니다) 조금 오래 알고 있지만, 내가이 사람과 솔루션을 공유했다이 너트 균열 나를 너무 오래 촬영하고있다 DOM을 구축하지 않는 SAX의 행 번호. DOM 파서는 줄 번호를 제공하지 않으며 사용하지 않는 SAX 파서 가까이에 두지 않습니다. 내 솔루션은 SAX 소스와 DOM 결과를 사용하여 빈 XSLT 변환을 수행하는 것입니다.하지만이 경우에도 누군가 숨기기 위해 최선을 다했습니다. 아래 코드를 참조하십시오.

위치 정보를 고유 한 네임 스페이스가있는 속성으로 각 요소에 추가하므로 XPath를 사용하여 요소를 찾고 데이터의 출처를보고 할 수 있습니다.

희망이 도움이 :

// The file to parse. 
String systemId = "myxml.xml"; 

/* 
* Create transformer SAX source that adds current element position to 
* the element as attributes. 
*/ 
XMLReader xmlReader = XMLReaderFactory.createXMLReader(); 
LocationFilter locationFilter = new LocationFilter(xmlReader); 

InputSource inputSource = new InputSource(new FileReader(systemId)); 
// Do this so that XPath function document() can take relative URI. 
inputSource.setSystemId(systemId); 
SAXSource saxSource = new SAXSource(locationFilter, inputSource); 

/* 
* Perform an empty transformation from SAX source to DOM result. 
*/ 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
DOMResult domResult = new DOMResult(); 
transformer.transform(saxSource, domResult); 
Node root = domResult.getNode(); 

... 
class LocationFilter extends XMLFilterImpl { 

    LocationFilter(XMLReader xmlReader) { 
     super(xmlReader); 
    } 

    private Locator locator = null; 

    @Override 
    public void setDocumentLocator(Locator locator) { 
     super.setDocumentLocator(locator); 
     this.locator = locator; 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

     // Add extra attribute to elements to hold location 
     String location = locator.getSystemId() + ':' + locator.getLineNumber() + ':' + locator.getColumnNumber(); 
     Attributes2Impl attrs = new Attributes2Impl(attributes); 
     attrs.addAttribute("http://myNamespace", "location", "myns:location", "CDATA", location); 
     super.startElement(uri, localName, qName, attrs); 
    } 
} 
+0

정보를 제공해 주셔서 감사합니다. – Chris

+0

절대적으로 필수적이고 명확하고 간결합니다. 나는 이것이 존재해야한다는 것을 알았다. – albfan

관련 문제