2010-01-13 5 views
3

내가 SAX와 해당 문서를 구문 분석하기 위해 노력하고있어 몇 가지 특성을 읽을 수 없습니다 startElement 핸들러가있는 속성이지만 scxml의 속성 목록 크기는 0입니다. 왜? 어떻게 그 문제를 극복 할 수 있습니까?는 SAX

편집 : 첫 번째 태그를 구문 분석 할 때

public void startElement(String uri, String localName, String qName, Attributes attributes){ 
    System.out.println(attributes.getValue("initialstate")); 
    System.out.println(attributes.getValue("name")); 
} 

가 작동하지 않습니다 (인쇄 "널 (null)"두 번). 사실,

attributes.getLength(); 

은 0으로 평가됩니다.

감사

+0

:

public class SaxParserMain { /** * @param args * @throws SAXException * @throws ParserConfigurationException * @throws IOException */ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); CustomHandler handler = new CustomHandler(); parser.parse(new File("file/scxml.xml"), handler); } } 

public class CustomHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println(); System.out.print("<" + qName + ""); if (attributes.getLength() == 0) { System.out.print(">"); } else { System.out.print(" "); for (int index = 0; index < attributes.getLength(); index++) { System.out.print(attributes.getLocalName(index) + " => " + attributes.getValue(index)); } System.out.print(">"); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("\n</" + qName + ">"); } } 

출력은 반갑습니다. – rochb

+0

public void startElement (String uri, String localName, String qName, 특성 특성) { System.out.println (attributes.getValue ("initialstate"))); System.out.println (attributes.getValue ("name"))); } 첫 번째 태그가 구문 분석 될 때 작동하지 않습니다. – akappa

+0

문서에 XML 네임 스페이스가 있습니까? – skaffman

답변

2

나는 there에서 근무하는 전체 예제를 가지고 당신의 파일을 적응했습니다 : 나는 몇 가지 코드를 추측

<scxml version => 1.0initialstate => startname => calc> 
<datamodel> 
<data id => exprexpr => 0> 
</data> 
<data id => resexpr => 0> 
</data> 
</datamodel> 
<state id => start> 
<transition event => OPERtarget => opEntered> 
</transition> 
<transition event => DIGITtarget => operand> 
</transition> 
</state> 
<state id => operand> 
<transition event => OPERtarget => opEntered> 
</transition> 
<transition event => DIGIT> 
</transition> 
</state> 
</scxml> 
+1

어, 감사합니다. 문제가 해결되었습니다. 문제는 색소폰이 항상 동일한 속성 인스턴스를 사용하여 이벤트를 제기 할 때마다 채우는 것입니다. 나는 그것이 항상/다른/인스턴스라고 가정했다. 한숨! :) – akappa

+0

네, javadoc이 말합니다 : "atts - 요소에 첨부 된 속성. 속성이 없으면 빈 Attributes 객체입니다. ** startElement가 반환 한 후이 객체의 값은 정의되지 않았습니다. **" – Andreas

1

Attributes.getValue()은 보면 간단하지 않습니다. javadoc의 답변 :

XML의 정규화 된 이름으로 속성 값을 찾습니다.

따라서 "initialstate"는 기술적으로 정규화 된 이름이 아니므로 이름 공간이 복잡 할 경우 "initialstate"로 전달하면 작동하지 않을 수 있습니다.

getValue(int)과 같이 Attributes 클래스의 다른 방법으로 게임하는 것이 좋습니다. 더 많은 성공 사례가있을 수 있습니다.


편집 : startElement의이 호출은 당신이 생각하는 요소에 언급되지 않은 또 다른 가능성이있다. localName 인수가 실제로 scxml이라는 것을 확인 했습니까?

+0

문제는 첫 번째 태그의 속성 목록 길이가 0입니다 ... – akappa

+0

예, localName은 scxml입니다. – akappa