Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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查找和删除子节点_Java_Xml_Xpath - Fatal编程技术网

Java查找和删除子节点

Java查找和删除子节点,java,xml,xpath,Java,Xml,Xpath,我有一个XML文件,如下所示: <CourseList> <Course> <CourseName>CoreJava</CourseName> <Teacher>Bui Duy Linh</Teacher> <Duration>90 minutes</Duration> <Student> <StudentID>C001</

我有一个XML文件,如下所示:

<CourseList>
<Course>
    <CourseName>CoreJava</CourseName>
    <Teacher>Bui Duy Linh</Teacher>
    <Duration>90 minutes</Duration>
    <Student>
        <StudentID>C001</StudentID>
        <StudentName>Nam</StudentName>
        <DateRegister>15/11/2016</DateRegister>
    </Student>
    <Student>
        <StudentID>C002</StudentID>
        <StudentName>Vi</StudentName>
        <DateRegister>13/11/2016</DateRegister>
    </Student>
</Course>

科雷爪哇
比杜林
90分钟
C001
不结盟运动
15/11/2016
C002
不及物动词
13/11/2016

我想删除一个ID为C001的学生,但我的搜索函数似乎返回null

public static Node searchByID(String id, Document doc) {
    try {
        XPathFactory xpf = XPathFactory.newInstance();
        XPath xp = xpf.newXPath();
        NodeList list = (NodeList) xp.evaluate("CourseList/Course/Student/StudentID", doc, XPathConstants.NODESET);
        for (int i = 0; i < list.getLength(); i++) {
            String content = list.item(i).getTextContent();
            if (content.equalsIgnoreCase(id)) {
                Node p = list.item(i).getParentNode();
                return p;
            }
        }

    } catch (XPathExpressionException ex) {
        Logger.getLogger(AssignmentXML.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}
公共静态节点searchByID(字符串id,文档文档){
试一试{
XPathFactory xpf=XPathFactory.newInstance();
XPath xp=xpf.newXPath();
NodeList list=(NodeList)xp.evaluate(“CourseList/Course/Student/StudentID”,doc,XPathConstants.NODESET);
对于(int i=0;i

有办法解决吗?我应该改用DOM吗?感谢任何人的帮助

您说它返回空值,但它没有。它返回具有给定ID的
节点的
节点
对象。如果打印该节点,则会得到:

[Student: null]
这不是空值,而是一个
节点
对象,其
toString()
方法如下:

public String toString() {
    return "["+getNodeName()+": "+getNodeValue()+"]";
}
对于
元素
节点,根据
节点

  • nodeName
    与Element.tagName“相同”
  • nodeValue
    为“空”
如果实际使用以下命令将节点转换为文本:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node), new StreamResult(System.out));
您将获得:

<Student>
        <StudentID>C001</StudentID>
        <StudentName>Nam</StudentName>
        <DateRegister>15/11/2016</DateRegister>
    </Student>

C001
不结盟运动
15/11/2016

好吧,搜索没有问题,只是删除功能有问题。 我的旧代码:

Node delNode = searchByID(id, doc);
doc.getDocumentElement().removeChild(delNode);
它只删除文档中的节点,而不删除节点的元素。我这样做是为了修复:

Node delNode = searchByID(id, doc);
delNode.getParentNode().removeChild(delNode);

谢谢你的帮助:

< P>对于OP和未来读者,在需要重构或重新设计XML文档时考虑使用XSLT。不需要循环或if/then逻辑。是一种专门为这种需要而设计的本地专用语言。与C#、Python、Perl、PHP和VB等通用语言一样,Java维护XSLT1.0处理器。下面是OP请求的工作示例

XSLT脚本(另存为.xsl或.XSLT以在Java中使用)

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CourseList>
    <Course>
        <CourseName>CoreJava</CourseName>
        <Teacher>Bui Duy Linh</Teacher>
        <Duration>90 minutes</Duration>
        <Student>
            <StudentID>C002</StudentID>
            <StudentName>Vi</StudentName>
            <DateRegister>13/11/2016</DateRegister>
        </Student>
    </Course>
</CourseList>

科雷爪哇
比杜林
90分钟
C002
不及物动词
13/11/2016

您调试了代码吗?是的,content返回了C001,我设置了id=C001,但由于某种原因,它仍然返回Null。我尝试运行您的代码。返回了正确的结果(学生节点)。我只在XML的末尾添加了“”。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.OutputKeys;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class CourseList {
    public static void main(String[] args) throws IOException, URISyntaxException,
                                                  SAXException, 
                                                  ParserConfigurationException,
                                                  TransformerException {

        // LOAD XML AND XSL DOCUMENTS
        String inputXML = "C:\\Path\\To\\Input.xml";
        String xslFile =  "C:\\Path\\To\\XSLTScript.xsl";
        String outputXML =  "C:\\Path\\To\\Output.xml";                                   

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();            
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse (new File(inputXML));
        Source xslt = new StreamSource(new File(xslFile)); 

        // XSLT TRANSFORMATION WITH PRETTY PRINT
        TransformerFactory prettyPrint = TransformerFactory.newInstance();
        Transformer transformer = prettyPrint.newTransformer(xslt);

        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");                        

        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(outputXML));        
        transformer.transform(source, result);
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CourseList>
    <Course>
        <CourseName>CoreJava</CourseName>
        <Teacher>Bui Duy Linh</Teacher>
        <Duration>90 minutes</Duration>
        <Student>
            <StudentID>C002</StudentID>
            <StudentName>Vi</StudentName>
            <DateRegister>13/11/2016</DateRegister>
        </Student>
    </Course>
</CourseList>