Java XML文件解析-当我试图获取节点时,不断给出null

Java XML文件解析-当我试图获取节点时,不断给出null,java,xml,Java,Xml,我一直试图解析一个元素,但没有成功。当我运行这段代码时,我的调试print方法打印出“null”,这意味着找不到元素 sents数组是一个句子列表。每个模式都是正则表达式模式。我想做的是搜索一个句子是否符合一个模式。若有,则从多个模板中选择一个模板,否则创建一个新条目。我没有实现新条目的创建,因为我无法使下面的代码正常工作 顺便说一句,节点的内容似乎是空的,而不是节点本身 for (int i = 0; i < sents.length; i++) { for (int i1 = 0;

我一直试图解析一个元素,但没有成功。当我运行这段代码时,我的调试print方法打印出“null”,这意味着找不到元素

sents数组是一个句子列表。每个模式都是正则表达式模式。我想做的是搜索一个句子是否符合一个模式。若有,则从多个模板中选择一个模板,否则创建一个新条目。我没有实现新条目的创建,因为我无法使下面的代码正常工作

顺便说一句,节点的内容似乎是空的,而不是节点本身

for (int i = 0; i < sents.length; i++) {

for (int i1 = 0; i1 < categories.getLength(); i1++) {

Element root = parser.document.getDocumentElement();
NodeList categories = root.getChildNodes();
category = (Element) categories.item(i1);
pattern = category.getElementsByTagName("pattern").item(0);

if (pattern != null) {
     System.out.println(pattern.getNodeValue());
}
else {
 System.out.println("Pattern object is null.");
}

Pattern regex = Pattern.compile(pattern.getNodeValue());
        Matcher matcher = regex.matcher(sents[i]);

        if (matcher.matches()) { // If current sentence matches
            matches = true;
            break;
        }
}

if (matches) { // If found
    templates = category.getElementsByTagName("template");

    int chosen = Generator.generateInt(0,templates.getLength()-1); // Another class method tht generates an integer between 0 and templates.getLength()-1, note that the lower range and upper range are both inclusive.

    Node template = templates.item(chosen);

    System.out.println(template.getNodeValue());
}
}
XML文件如下所示:

    public XMLparser(String name) {
    document = getDocument(name);
}

protected static Document getDocument(String name) {
    try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(true);
        factory.setValidating(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(new InputSource(name));
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

protected void saveFile(String name) {
    try {
        //write the content into xml file
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(document);

        StreamResult result =  new StreamResult(new File(name+".xml"));
        transformer.transform(source, result);

        System.out.println("File saved!");
    }
    catch (Exception e) { e.printStackTrace(); }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE categories SYSTEM "vocab.dtd">
<categories>
    <category>
        <pattern>WHAT IS YOUR NAME</pattern>
        <template>My name is JavaBot.</template>
    </category>
</categories>

你叫什么名字?
我的名字叫JavaBot。
和dtd文件:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT categories (category*)>
<!ELEMENT category (pattern, template*)>
<!ELEMENT pattern (#PCDATA)>
<!ELEMENT template (#PCDATA)>

我真的不明白您的第一段代码是如何编译的,更不用说它应该做什么了,因为您在一个由名为catagories的变量限定的循环中定义了catagories,所以我肯定遗漏了什么。
然而,您实际的问题是,您正在撬动一个元素的节点值,这并不是什么。元素可以包含其他节点,但没有值。我想你的意思是打印元素中文本节点的值。试着这样做,我在给我的项目举一个例子。。这是针对单个节点的

Xml请求:

<?xml version="1.0" encoding="UTF-8"?>
<request>
<token></token>
<key>xxxx</key>
<secret>xxxx</secret>
</request>
<?xml version="1.0" encoding="UTF-8"?>
   <response>
   <token>2015fc52888d2953a30550c49d548299e8f5934d</token>
   </response>
public void getMToken(String xml){
        try {

                DocumentBuilderFactory odbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder odb =  odbf.newDocumentBuilder();
                InputSource is = new InputSource(new StringReader(xml));
                Document odoc = odb.parse(is);
                odoc.getDocumentElement().normalize ();    
                System.out.println ("Root element of the doc is " + odoc.getDocumentElement().getNodeName());
                NodeList LOP = odoc.getElementsByTagName("response");

                    Node FPN =LOP.item(0);
                    if(FPN.getNodeType() == Node.ELEMENT_NODE)
                        {

                        Element token = (Element)FPN;

                        NodeList oNameList = token.getElementsByTagName("token");
                        Element firstNameElement = (Element)oNameList.item(0);
                        NodeList textNList = firstNameElement.getChildNodes();
                        this.setToken(((Node)textNList.item(0)).getNodeValue().trim());
                        System.out.println("#####The Parsed data#####");
                        System.out.println("token : " + ((Node)textNList.item(0)).getNodeValue().trim());
                        System.out.println("#####The Parsed data#####");

                        }//end of if clause

                      }catch (SAXParseException err) {

            System.out.println (err.getMessage ());

            }catch (SAXException e) {
                 e.printStackTrace ();

            }catch (Throwable t) {
            t.printStackTrace ();
            }          
        }//end of token function

什么是
i1
?你能制作一个简短但完整的程序来演示这个问题吗?哦,刚刚意识到我没有展示那个部分。我会的。谢谢。另外,我已经确认数组sent中确实有内容。是否有空指针异常?如果是,请发布堆栈跟踪。否则,
System.out.println(pattern.getNodeValue())会做什么打印?它是打印“null”还是什么都没有(空字符串)?有点困惑,为什么你要循环分类中的每一项,再次获取整个文档并重置分类?Woody:我正在尝试为聊天机器人解析多个句子。另一个注意事项:我正在添加一个条件来检查节点模式是否有任何值。啊,非常感谢。但是,变量模式是一个节点,而不是一个元素。除非现在您更改了问题以添加它,否则答案没有意义!对不起。。。哈哈。如果你愿意,我可以给出完整的代码,但是它会占用很多空间,而且更可能让每个人都感到困惑。没问题——很高兴它有帮助,如果有帮助,别忘了标记答案!哇,在上找到了一个链接,它最终让我找到了为什么我的代码不工作的答案!在这里也是一样,所以就拿25分吧,伍迪。:)谢谢你的帮助!看来代码是差不多一样的。。。我不确定这是否回答了我的问题,但无论如何,感谢您发布代码。