如何创建一个区域?

huangapple go评论68阅读模式
英文:

How to create an area?

问题

import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ReadXMLFile {
    public static void main(String[] args) {

        SAXBuilder builder = new SAXBuilder();
        File xmlFile = new File("c:\\test.xml");

        try {

            Document document = (Document) builder.build(xmlFile);
            Element rootNode = document.getRootElement();
            List list = rootNode.getChildren("raum");

            for (int i = 0; i < list.size(); i++) {

                Element node = (Element) list.get(i);

                System.out.println("ID : " + node.getChildText("ID"));

            }

        } catch (IOException io) {
            System.out.println(io.getMessage());
        } catch (JDOMException jdomex) {
            System.out.println(jdomex.getMessage());
        }
    }
}

I don't understand how the step in between has to look like in order to insert the imported coordinates into the polygon.. Maybe someone can help me with this?


<details>
<summary>英文:</summary>


    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;

    public class ReadXMLFile {
    public static void main(String[] args) {

	  SAXBuilder builder = new SAXBuilder();
	  File xmlFile = new File(&quot;c:\\test.xml&quot;);

	  try {

		Document document = (Document) builder.build(xmlFile);
		Element rootNode = document.getRootElement();
		List list = rootNode.getChildren(&quot;raum&quot;);

		for (int i = 0; i &lt; list.size(); i++) {

		   Element node = (Element) list.get(i);

		   System.out.println(&quot;ID : &quot; + node.getChildText(&quot;ID&quot;));

		}

	  } catch (IOException io) {
		System.out.println(io.getMessage());
	  } catch (JDOMException jdomex) {
		System.out.println(jdomex.getMessage());
	  }
	}
}


I don&#39;t understand how the step in between has to look like in order to insert the imported coordinates into the polygon.. Maybe someone can help me with this? 

</details>


# 答案1
**得分**: 2

你可以按照任何JDOM解析器示例进行操作。
例如,[这个][1]解释了如何读取xml,将数据放入列表并对其进行迭代。只需按照步骤操作并理解自己在做什么,就可以轻松完成。

<details>
<summary>英文:</summary>

You can follow any sample JDOM parser example and do it.
For example, [this][1] explains how to read  the xml and take the data in a list and iterate over it. Just follow the steps and understand what you  are doing, you can easily get it done.


  [1]: https://mkyong.com/java/how-to-read-xml-file-in-java-jdom-example/

</details>



# 答案2
**得分**: 1

你可以阅读XML文件DOM解析库的详细信息,请查阅[此文章][1]。

我假设你正在开发桌面应用程序,因此可能希望使用FileChooser来进行文件选择。以下是一个[示例][2]。

另外,我认为你需要对XML文件进行一些结构上的更改(以方便处理),使其类似于这样的结构:
```xml
<xpoints>
 <x>5<x/>
...
</xpoints>
<ypoints>
 <y>5<y/>
...
</ypoints>

但对于现有的结构,进行如下操作足够:

File file = new File("file");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getElementsByTagName("edge");
// 你可以遍历所有的edge元素
for (int itr = 0; itr < nodeList.getLength(); itr++)
{
  Node node = nodeList.item(itr);
  if (node.getNodeType() == Node.ELEMENT_NODE)
  {
    Element eElement = (Element) node;

    // 然后你可以访问值,例如将它们添加到数组中
    array.add(eElement.getElementsByTagName("x").item(0).getTextContent());

  }
}
英文:

You can read XML files DOM parser library check this article.

I assume you are working on a Desktop application so you might want to use FileChooser for file selection. Here is an example of this.

Also, I think you would need to make some structural changes (for convinience) to your XML file so that it would have something like this:

&lt;xpoints&gt;
 &lt;x&gt;5&lt;x/&gt;
...
&lt;/xpoints&gt;
&lt;ypoints&gt;
 &lt;y&gt;5&lt;y/&gt;
...
&lt;/ypoints&gt;

But for existing structure doing something like this would be enogh:

    File file = new File(&quot;file&quot;);
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(file);
    doc.getDocumentElement().normalize();
    NodeList nodeList = doc.getElementsByTagName(&quot;edge&quot;);
// you can iterate over all edges
    for (int itr = 0; itr &lt; nodeList.getLength(); itr++)
    {
      Node node = nodeList.item(itr);
      if (node.getNodeType() == Node.ELEMENT_NODE)
      {
        Element eElement = (Element) node;

//then you can access values, for example, to pass them to an array
        array.add(eElement.getElementsByTagName(&quot;x&quot;).item(0).getTextContent()));

      }
    }

答案3

得分: 1

以下为翻译好的部分:

For the sake of completeness?  
This is how to achieve it using SAX parser.  
Note that it is not clear to me, from your question, which `Polygon` you are referring to. I presume it is a java class. It can't be [`java.awt.Polygon`][1] because its points are all `int` whereas your sample XML file contains only `double` values. The only other class I thought of was [`javafx.scene.shape.Polygon`][2] that contains an array of points where each point is a `double`. Hence in the below code, I create an instance of `javafx.scene.shape.Polygon`.

For the situation you describe in your question, I don't see the point (no pun intended) in loading the entire DOM tree into memory. You simply need to create a point every time you encounter a _x_ and a _y_ coordinate in the XML file and add those coordinates to a collection of points.

Here is the code. Note that I created an XML file named _polygon0.xml_ that contains the entire XML from your question. Also note that you can extend class [`org.xml.sax.helpers.DefaultHandler`][3] rather than implement interface `ContentHandler`.
```java
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

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

import javafx.scene.shape.Polygon;

public class Polygons implements ContentHandler {
    private boolean isX;
    private boolean isY;
    private Polygon polygon;
/* Start 'ContentHandler' interface methods. */
    @Override // org.xml.sax.ContentHandler
    public void setDocumentLocator(Locator locator) {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void startDocument() throws SAXException {
        polygon = new Polygon();
    }

    @Override // org.xml.sax.ContentHandler
    public void endDocument() throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void startPrefixMapping(String prefix, String uri) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void endPrefixMapping(String prefix) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        isX = "x".equals(qName);
        isY = "y".equals(qName);
    }

    @Override // org.xml.sax.ContentHandler
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (isX) {
            isX = false;
        }
        if (isY) {
            isY = false;
        }
    }

    @Override // org.xml.sax.ContentHandler
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (isX || isY) {
            StringBuilder sb = new StringBuilder(length);
            int end = start + length;
            for (int i = start; i < end; i++) {
                sb.append(ch[i]);
            }
            polygon.getPoints().add(Double.parseDouble(sb.toString()));
        }
    }

    @Override // org.xml.sax.ContentHandler
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void processingInstruction(String target, String data) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void skippedEntity(String name) throws SAXException {
        // Do nothing.
    }
/* End 'ContentHandler' interface methods. */
    public static void main(String[] args) {
        Polygons instance = new Polygons();
        Path path = Paths.get("polygon0.xml");
        SAXParserFactory spf = SAXParserFactory.newInstance();
        try (FileReader reader = new FileReader(path.toFile())) { // throws java.io.IOException
            SAXParser saxParser = spf.newSAXParser(); // throws javax.xml.parsers.ParserConfigurationException , org.xml.sax.SAXException
            XMLReader xmlReader = saxParser.getXMLReader(); // throws org.xml.sax.SAXException
            xmlReader.setContentHandler(instance);
            InputSource input = new InputSource(reader);
            xmlReader.parse(input);
            System.out.println(instance.polygon);
        }
        catch (IOException                  |
               ParserConfigurationException |
               SAXException x) {
            x.printStackTrace();
        }
    }
}

Here is the output from running the above code:

Polygon[points=[400.3, 997.2, 400.3, 833.1, 509.9, 833.1, 509.9, 700.0, 242.2, 700.0, 242.2, 600.1, 111.1, 600.1, 111.1, 300.0, 300.0, 300.0, 300.0, 420.0, 600.5, 420.0, 600.5, 101.9, 717.8, 101.9, 717.8, 200.0, 876.5, 200.0, 876.5, 500.8, 1012.1, 500.8, 1012.1, 900.2, 902.0, 900.2, 902.0, 997.2], fill=0x000000ff]

EDIT

As requested, by OP, here is an implementation using JDOM (version 2.0.6)

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.ElementFilter;
import org.jdom2.input.SAXBuilder;
import org.jdom2.util.IteratorIterable;

import javafx.scene.shape.Polygon;

public class Polygon2 {
    public static void main(String[] args) {
        Polygon polygon = new Polygon();
        Path path = Paths.get("polygon0.xml");
        SAXBuilder builder = new SAXBuilder();
        try {
            Document jdomDoc = builder.build(path.toFile()); // throws java.io.IOException , org.jdom2.JDOMException
            Element root = jdomDoc.getRootElement();
            IteratorIterable<Element> iter = root.getDescendants(new ElementFilter("edge"));
            while (iter.hasNext()) {
                Element elem = iter.next();
                Element childX = elem.getChild("x");
                polygon.getPoints().add(Double.parseDouble(childX.getText()));
                Element childY = elem.getChild("y");
                polygon.getPoints().add(Double.parseDouble(childY.getText()));
            }
        }
        catch (IOException | JDOMException x) {
           

<details>
<summary>英文:</summary>

For the sake of completeness?  
This is how to achieve it using SAX parser.  
Note that it is not clear to me, from your question, which `Polygon` you are referring to. I presume it is a java class. It can&#39;t be [`java.awt.Polygon`][1] because its points are all `int` whereas your sample XML file contains only `double` values. The only other class I thought of was [`javafx.scene.shape.Polygon`][2] that contains an array of points where each point is a `double`. Hence in the below code, I create an instance of `javafx.scene.shape.Polygon`.

For the situation you describe in your question, I don&#39;t see the point (no pun intended) in loading the entire DOM tree into memory. You simply need to create a point every time you encounter a _x_ and a _y_ coordinate in the XML file and add those coordinates to a collection of points.

Here is the code. Note that I created an XML file named _polygon0.xml_ that contains the entire XML from your question. Also note that you can extend class [`org.xml.sax.helpers.DefaultHandler`][3] rather than implement interface `ContentHandler`.
```java
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

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

import javafx.scene.shape.Polygon;

public class Polygons implements ContentHandler {
    private boolean isX;
    private boolean isY;
    private Polygon polygon;
/* Start &#39;ContentHandler&#39; interface methods. */
    @Override // org.xml.sax.ContentHandler
    public void setDocumentLocator(Locator locator) {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void startDocument() throws SAXException {
        polygon = new Polygon();
    }

    @Override // org.xml.sax.ContentHandler
    public void endDocument() throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void startPrefixMapping(String prefix, String uri) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void endPrefixMapping(String prefix) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        isX = &quot;x&quot;.equals(qName);
        isY = &quot;y&quot;.equals(qName);
    }

    @Override // org.xml.sax.ContentHandler
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (isX) {
            isX = false;
        }
        if (isY) {
            isY = false;
        }
    }

    @Override // org.xml.sax.ContentHandler
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (isX || isY) {
            StringBuilder sb = new StringBuilder(length);
            int end = start + length;
            for (int i = start; i &lt; end; i++) {
                sb.append(ch[i]);
            }
            polygon.getPoints().add(Double.parseDouble(sb.toString()));
        }
    }

    @Override // org.xml.sax.ContentHandler
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void processingInstruction(String target, String data) throws SAXException {
        // Do nothing.
    }

    @Override // org.xml.sax.ContentHandler
    public void skippedEntity(String name) throws SAXException {
        // Do nothing.
    }
/* End &#39;ContentHandler&#39; interface methods. */
    public static void main(String[] args) {
        Polygons instance = new Polygons();
        Path path = Paths.get(&quot;polygon0.xml&quot;);
        SAXParserFactory spf = SAXParserFactory.newInstance();
        try (FileReader reader = new FileReader(path.toFile())) { // throws java.io.IOException
            SAXParser saxParser = spf.newSAXParser(); // throws javax.xml.parsers.ParserConfigurationException , org.xml.sax.SAXException
            XMLReader xmlReader = saxParser.getXMLReader(); // throws org.xml.sax.SAXException
            xmlReader.setContentHandler(instance);
            InputSource input = new InputSource(reader);
            xmlReader.parse(input);
            System.out.println(instance.polygon);
        }
        catch (IOException                  |
               ParserConfigurationException |
               SAXException x) {
            x.printStackTrace();
        }
    }
}

Here is the output from running the above code:

Polygon[points=[400.3, 997.2, 400.3, 833.1, 509.9, 833.1, 509.9, 700.0, 242.2, 700.0, 242.2, 600.1, 111.1, 600.1, 111.1, 300.0, 300.0, 300.0, 300.0, 420.0, 600.5, 420.0, 600.5, 101.9, 717.8, 101.9, 717.8, 200.0, 876.5, 200.0, 876.5, 500.8, 1012.1, 500.8, 1012.1, 900.2, 902.0, 900.2, 902.0, 997.2], fill=0x000000ff]

EDIT

As requested, by OP, here is an implementation using JDOM (version 2.0.6)

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.ElementFilter;
import org.jdom2.input.SAXBuilder;
import org.jdom2.util.IteratorIterable;

import javafx.scene.shape.Polygon;

public class Polygon2 {
    public static void main(String[] args) {
        Polygon polygon = new Polygon();
        Path path = Paths.get(&quot;polygon0.xml&quot;);
        SAXBuilder builder = new SAXBuilder();
        try {
            Document jdomDoc = builder.build(path.toFile()); // throws java.io.IOException , org.jdom2.JDOMException
            Element root = jdomDoc.getRootElement();
            IteratorIterable&lt;Element&gt; iter = root.getDescendants(new ElementFilter(&quot;edge&quot;));
            while (iter.hasNext()) {
                Element elem = iter.next();
                Element childX = elem.getChild(&quot;x&quot;);
                polygon.getPoints().add(Double.parseDouble(childX.getText()));
                Element childY = elem.getChild(&quot;y&quot;);
                polygon.getPoints().add(Double.parseDouble(childY.getText()));
            }
        }
        catch (IOException | JDOMException x) {
            x.printStackTrace();
        }
        System.out.println(polygon);
    }
}

huangapple
  • 本文由 发表于 2020年4月11日 01:01:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/61145060.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定