Android: SAX анализирует XML с теми же тегами

Я хочу проанализировать с помощью SAX этот тип файла:

<MotionGraph>
  <Nodes>
    <NodePoint>308 204 0</NodePoint>
    <NodePoint>67 202 0</NodePoint>
    <NodePoint>509 206 0</NodePoint>
  </Nodes>
  <Arcs>
    <Arc>14 2 35</Arc>
    <Arc>13 3 22</Arc>
    <Arc>2 4 13</Arc>
  </Arcs>
</MotionGraph>

Вот мой код:

public NodeValue nodes = null;
public ArrayList<NodeValue> motionNodePoints = new ArrayList<NodeValue>();
public ArcValue arcs = null;
public ArrayList<ArcValue> motionArcs = new ArrayList<ArcValue>();

   public class EnvironmentDataParse extends DefaultHandler{

    String TAG = "XMLHelper";

    Boolean currTag = false;
    String currTagVal = "";
    private Boolean inTag = false;

    public void get() {
        try {       
            String path = SharedValues.path;        
            File file = new File(path);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser mSaxParser = factory.newSAXParser();
            XMLReader mXmlReader = mSaxParser.getXMLReader();
            mXmlReader.setContentHandler(this);
            mXmlReader.parse(new InputSource(new FileInputStream(file)));   
        } catch(Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(currTag) {
            currTagVal = currTagVal + new String(ch, start, length);
            currTag = false;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        currTag = false;

        if(localName.equalsIgnoreCase("Boundary"))
            boundary.setBoundary(currTagVal);


        else if(localName.equalsIgnoreCase("NodePoint"))
            nodes.setNodePoint(currTagVal);

        else if(localName.equalsIgnoreCase("Nodes"))
            motionNodePoints.add(nodes);

        else if(localName.equalsIgnoreCase("Arc"))
            arcs.setArc(currTagVal);

        else if(localName.equalsIgnoreCase("Arcs"))
            motionArcs.add(arcs);
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        Log.i(TAG, "TAG: " + localName);

        currTag = true;
        currTagVal = "";
        if(localName.equals("head"))
            boundary = new BoundaryValue();

        else if(localName.equals("Space"))
            space = new SpaceValue();   

        else if(localName.equals("Nodes"))
            nodes = new NodeValue();

        else if(localName.equals("Arcs"))
            arcs = new ArcValue();
    }
}

и мои классы NodeValue.java и ArcValue.java:

public class NodeValue implements Serializable{

private String nodePoint;

public String getNodePoint() {
    return nodePoint;
}

public void setNodePoint(String nodePoint) {
    this.nodePoint = nodePoint;
}

}

public class ArcValue implements Serializable{

private String arc;

public String getArc() {
    return arc;
}

public void setArc(String arc) {
    this.arc = arc;
}

}

Моя проблема в том, что когда я использую код, я получаю только последнюю строку NodePoint или Arc (то есть только 3 данных), и я хочу иметь все 3 строки (9 данных) в массиве:

for (int i = 0; i < motionNodePoints.size(); i++) {
if (motionNodePoints.get(i).getNodePoint() == null) {}
else {
    float [] NodePoints = extractFloats(motionNodePoints.get(i).getNodePoint());
        for (int ii = 0; ii < NodePoints.length; ii ++) {
           Log.i("GEOMETRY", "ii " + ii);
           Log.i("GEOMETRY", "NODE POINT " + NodePoints[ii]);
        }
    }
}

Может кто-нибудь объяснить, что я делаю неправильно?


person user2748484    schedule 11.01.2014    source источник


Ответы (1)


В вашем методе endElement вы добавляете в список нахождение конца тега <Arcs>. Вам нужно сделать это в конце тега <Arc>, сразу после создания добавляемого элемента. После того, как вы внесете это изменение, этот элемент, скорее всего, также не обязательно должен быть полем, но может быть локальной переменной и может быть создан в методе endElement вместо метода startElement.

Аналогично для <Nodes> и <NodePoint>.

person Don Roby    schedule 11.01.2014