Java查找和删除子节点
我有一个XML文件,如下所示: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</
<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()+"]";
}
对于元素
节点,根据节点
:
与Element.tagName“相同”nodeName
为“空”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>