Java 从XML文件读取

Java 从XML文件读取,java,xml,file,Java,Xml,File,我一直在试图找到一种从Java中的XML文件中读取特定数据的方法。我正在使用DOM和SAX 我正在创建一个方法readLayoutFile(stringareaname),程序将为请求的区域返回以下变量:varChecked,varGeo[][] 我的问题是如何指定要在三角形1下检查的值。另外,如何调用三角形1下的几何体下的所有坐标 提前谢谢。 /克里斯 编辑:到目前为止,我只读取了整个XML文件中的大部分数据,这与我实际想要做的工作相差甚远: try { Fi

我一直在试图找到一种从Java中的XML文件中读取特定数据的方法。我正在使用DOM和SAX

我正在创建一个方法
readLayoutFile(stringareaname)
,程序将为请求的区域返回以下变量:
varChecked
varGeo[][]

我的问题是如何指定要在三角形1下检查
的值。另外,如何调用三角形1下的
几何体下的所有坐标

提前谢谢。 /克里斯

编辑:到目前为止,我只读取了整个XML文件中的大部分数据,这与我实际想要做的工作相差甚远:

        try {

        File fXmlFile = new File("C:\\Users/Chris/Desktop/layout1.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();

        NodeList areaList = doc.getElementsByTagName("area");

        for (int i = 0; i < areaList.getLength(); i++) {

            Node areaNode = areaList.item(i);
            System.out.println();
            if (areaNode.getNodeType() == Node.ELEMENT_NODE) {

                Element areaElement = (Element) areaNode;

                System.out.println("Area Name : " + areaElement.getAttribute("name"));
                System.out.println("Checked : " + areaElement.getElementsByTagName("checked").item(0).getTextContent());

                NodeList geoList = doc.getElementsByTagName("geometries");
                for (int j = 0; j < geoList.getLength(); j++) {

                    NodeList geomList = doc.getElementsByTagName("geo");
                    Node geoNode = geomList.item(j);
                    if (geoNode.getNodeType() == Node.ELEMENT_NODE) {

                        Element geoElement = (Element) geoNode;
                        System.out.println("Geo Point " + (j+1) + ": " + geoElement.getAttribute("lat") + ", " + geoElement.getAttribute("long"));
                    }
                }
            }
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
试试看{
文件fXmlFile=新文件(“C:\\Users/Chris/Desktop/layout1.xml”);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
documentdoc=dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
节点列表区域列表=doc.getElementsByTagName(“区域”);
对于(int i=0;i
如果希望将结构存储在内存中以供重复查询,请使用JAXB将整个文档存储在Java POJO结构中

如果是一次性的,使用SAX。以下是查找条目的处理程序:

import java.util.ArrayList;
import java.util.Collection;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

public class GeoFinder implements ContentHandler
{
    private final String areaName;

    private boolean capturing;
    private Collection<float[]> geoList;

    public GeoFinder(String areaName)
    {
        this.areaName = areaName;
    }

    public float[][] getGeoList()
    {
        if (geoList == null)
        {
            return null;
        }
        return geoList.toArray(new float[geoList.size()][]);
    }

    @Override
    public void characters(char[] ch, int start, int length) {}

    @Override
    public void endDocument() {}

    @Override
    public void endElement(String uri, String localName, String qName)
    {
        if ("area".equals(localName))
        {
            capturing = false;
        }
    }

    @Override
    public void endPrefixMapping(String prefix) throws SAXException {}

    @Override
    public void ignorableWhitespace(char[] ch, int start, int length) {}

    @Override
    public void processingInstruction(String target, String data) {}

    @Override
    public void setDocumentLocator(Locator locator) {}

    @Override
    public void skippedEntity(String name) {}

    @Override
    public void startDocument() {}

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes atts)
    {
        if ("area".equals(localName))
        {
            if (areaName.equals(atts.getValue("name")))
            {
                capturing = true;
                geoList = new ArrayList<float[]>();
            }
        }
        else if ("geo".equals(localName) && capturing)
        {
            geoList.add(new float[]{
                    Float.parseFloat(atts.getValue("lat")),
                    Float.parseFloat(atts.getValue("long")),
            });
        }
    }

    @Override
    public void startPrefixMapping(String prefix, String uri) {}

}

向我们展示您尝试使用DOM读取此文件的代码。根据请求添加了代码。
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
GeoFinder gf = new GeoFinder("Triangle1");
xmlReader.setContentHandler(gf);
InputStream is = new FileInputStream("C:\\Users/Chris/Desktop/layout1.xml");
try
{
    xmlReader.parse(new InputSource(is));
}
finally
{
    try
    {
        is.close();
    }
    catch (Throwable t)
    {
        t.printStackTrace();
    }
}
if (gf.getGeoList() == null)
{
    System.err.println("No area found");
}
else
{
    for (float[] e: gf.getGeoList())
    {
        System.out.println(e[0] + ", " + e[1]);
    }
}