Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这个Java XML解析代码有什么问题?_Java_Xml_Parsing - Fatal编程技术网

什么';这个Java XML解析代码有什么问题?

什么';这个Java XML解析代码有什么问题?,java,xml,parsing,Java,Xml,Parsing,我试图解析一个XML文件,并且能够插入一个路径并获取字段的值 情况如下: import java.io.IOException; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; public class XMLConfigManager { private Element config = null; public XMLConfigManager(Strin

我试图解析一个XML文件,并且能够插入一个路径并获取字段的值

情况如下:

import java.io.IOException;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class XMLConfigManager {
    private Element config = null;

    public XMLConfigManager(String file) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            Document domTree;
            DocumentBuilder db = dbf.newDocumentBuilder();
            domTree = db.parse(file);
            config = domTree.getDocumentElement();
        }
        catch (IllegalArgumentException iae) {
            iae.printStackTrace();
        }
        catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        }
        catch (SAXException se) {
            se.printStackTrace();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
    public String getStringValue(String path) {
        String[] pathArray = path.split("\\|");
        Element tempElement = config;
        NodeList tempNodeList = null;
        for (int i = 0; i < pathArray.length; i++) {
            if (i == 0) {
                if (tempElement.getNodeName().equals(pathArray[0])) {
                    System.out.println("First element is correct, do nothing here (just in next step)");
                }
                else {
                    return "**This node does not exist**";
                }
            }
            else {
                tempNodeList = tempElement.getChildNodes();
                tempElement = getChildElement(pathArray[i],tempNodeList);
            }
        }    
        return tempElement.getNodeValue();
    }
    private Element getChildElement(String identifier, NodeList nl) {
        String tempNodeName = null;
        for (int i = 0; i < nl.getLength(); i++) {
            tempNodeName = nl.item(i).getNodeName();
            if (tempNodeName.equals(identifier)) {
                Element returner = (Element)nl.item(i).getChildNodes();
                return returner;
            }
        }
        return null;
    }
}
在这里,我期望标签
spam
的值,因此这将是“
这是测试返回字符串
”。但是我得到了
null

我几天来一直试图解决这个问题,但我就是搞不懂。迭代的工作原理是到达标记
spam
,但是,正如我所说的,它返回
null
,而不是文本

这是一个错误还是我做错了?为什么?(

非常感谢你的帮助


关于Flo,我想知道为什么您没有使用类似库的内置XPath。您正在使用非常低级的API(WC3 DOM)做大量工作


逐步使用调试器,看看
节点有哪些子节点。您应该很快找出它为什么为null。这比在这里询问要快。

我想知道为什么您没有使用类似库的内置XPath。您正在使用非常低级的API(WC3 DOM)进行大量工作


逐步使用调试器,查看
节点有哪些子节点。您应该快速找出它为null的原因。这比在此处询问要快。

您正在调用
节点。getNodeValue()
-当您在元素上调用它时,它被记录为返回null。您应该调用
getTextContent()
相反-当然,也可以使用更高级别的API。

您正在调用
节点.getNodeValue()
-当您在元素上调用它时,它被记录为返回null。您应该调用
getTextContent()
相反-当然,也可以使用更高级别的API。

因为您正在使用
getNodeValue()
而不是
getTextContent()


手动执行此操作是一个即将发生的意外;或者使用内置XPath解决方案,或者使用@duffymo建议的第三方库。我认为,这不是重新发明增加价值的情况。

因为您使用的是
getNodeValue()
,而不是
getTextContent()


手动执行此操作是一个即将发生的意外事件;要么使用内置XPath解决方案,要么使用@duffymo建议的第三方库。我认为,这不是一种再发明增加价值的情况。

正如我前面提到的其他人所说,您似乎正在重新发明的概念。您可以用以下代码替换您的代码:

javax.xml.xpath.XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
String expression = "/amc/controller/general/spam";
org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource("myConfig.xml");
String result = xpath.evaluate(expression, inputSource);
另见:

编辑:

使用XPath提取集合的示例:

NodeList result = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
for (int i = 0; i < result.getLength(); i++) {
    System.out.println(result.item(i).getTextContent());
}
NodeList结果=(NodeList)xpath.evaluate(表达式、inputSource、XPathConstants.NODESET);
for(int i=0;i
javax.xml.xpath.xpath
接口是有文档记录的,本文中还有一些示例


此外,还有用于XML操作的第三方库,您可能会发现它们更方便,例如(建议的)或者。无论您使用哪个库,都可以利用非常强大的XPath语言。

正如我前面提到的其他人一样,您似乎正在重新定义的概念。您可以用以下代码替换您的代码:

javax.xml.xpath.XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
String expression = "/amc/controller/general/spam";
org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource("myConfig.xml");
String result = xpath.evaluate(expression, inputSource);
另见:

编辑:

使用XPath提取集合的示例:

NodeList result = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
for (int i = 0; i < result.getLength(); i++) {
    System.out.println(result.item(i).getTextContent());
}
NodeList结果=(NodeList)xpath.evaluate(表达式、inputSource、XPathConstants.NODESET);
for(int i=0;i
javax.xml.xpath.xpath
接口是有文档记录的,本文中还有一些示例


此外,还有用于XML操作的第三方库,您可能会发现它们更方便,例如(建议的)或者。无论使用哪个库,都可以利用功能强大的XPath语言。

您可能走得太远了。如果在循环中获得了该|分隔列表中所有元素的子元素,则最后返回的值将是“spam”的子元素,它不存在。Java自JavaSE 5以来就有一个XPath库。它可以在
javax.xml.XPath
包中找到。您可能走得太远了。如果在循环中您得到了该|分隔列表中所有元素的子元素,则最后返回的值将是“spam”的子元素,它不存在。Java自JavaSE 5以来就有一个XPath库。它可以在
javax.xml.XPath
包中找到。如果复制了部分
,并且第二个标记name和ifc中有其他值,我如何从中获取集合?(所有代理/例如所有代理/名称值)?nameAnameB@Florian我添加了一个提取集合的示例。如果零件
被复制,并且第二个标记name和ifc中有其他值,我如何从中提取集合?(所有代理/例如所有代理/名称值)?nameAnameB@Florian我添加了一个提取集合的示例。