【问题标题】:Java parse XML parent and child elements with the same nameJava解析同名的XML父子元素
【发布时间】:2021-12-29 14:05:57
【问题描述】:

我正在尝试解析一些服务器设置。

  <server>
    <name>HTTP server</name>
    <ssl>
      <name>HTTPS server</name>
      <listen-port>8051</listen-port>
    </ssl>
    <listen-port>8050</listen-port>
  </server>

我正在尝试将两个侦听端口解析为我的 Java 程序中的变量,但我似乎只在我还想解析另一个端口时才获得 SSL 端口。

            File inputFile = new File(String.valueOf(Paths.get(serverPath, "config", "config.xml")));
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();

            NodeList nList = doc.getElementsByTagName("server");

            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node node = nList.item(temp);

                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) node;

                    try {
                        HttpPort = eElement.getElementsByTagName("listen-port").item(0).getTextContent();
                        System.out.println("Http: " + HttpPort);
                        Node sslSettings = eElement.getElementsByTagName("ssl").item(0);

                        if (nList.getLength() == 1) {
                            Element sslElement = (Element) sslSettings;
                            System.out.println(sslElement);
                            HttpsPort = sslElement.getElementsByTagName("listen-port").item(0).getTextContent();
                            System.out.println("Https: " + HttpsPort);
                        }

当我尝试在上面的示例中显示 HTTP 端口(第二个监听端口 XML 标记,但在父标记中)时,它显示了 SSL 端口。 System.out.println("Https:" + HttpsPort);似乎可以正常工作。

谁有想法?

【问题讨论】:

    标签: java xml-parsing xmldom


    【解决方案1】:

    您应该像这样使用 XPath 提取正确的节点:

    import org.w3c.dom.Document;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
    import java.io.IOException;
    import java.io.StringReader;
    
    public class FindViaXpath {
    
      private static final String XML =
        " <server>\n" +
          "    <name>HTTP server</name>\n" +
          "    <ssl>\n" +
          "      <name>HTTPS server</name>\n" +
          "      <listen-port>8051</listen-port>\n" +
          "    </ssl>\n" +
          "    <listen-port>8050</listen-port>\n" +
          "  </server>";
    
      public static void main(String[] args) {
        System.out.println(XML);
    
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        try {
          builder = factory.newDocumentBuilder();
          StringReader reader = new StringReader(XML);
          InputSource source = new InputSource(reader);
          Document document = builder.parse(source);
          XPath xpath = XPathFactory.newInstance().newXPath();
          String port = (String) xpath.evaluate("//server/listen-port", document, XPathConstants.STRING);
          System.out.println(String.format("Port: %s", port));
        } catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException e) {
          e.printStackTrace();
        }
      }
    }
    

    【讨论】:

    • 这正是我需要的!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2011-01-01
    • 2014-02-27
    • 2023-04-08
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多