使用JDOM解析XML文件的问题

使用JDOM解析XML文件的问题,第1张

只要会使用XPath,这个问题就可以解决了。希望你学习一下XPath。JDOM及DOM4J都对XPath有相应的支持,下面是使用JDOM来处理你的问题的原代码。

import org.jdom.*

import org.jdom.input.*

import org.jdom.xpath.XPath

import java.io.*

public class JDOMTest {

public static void main(String[] args) throws Exception {

SAXBuilder sb = new SAXBuilder()

Document doc = sb.build(new FileInputStream("disks.xml"))

Element root = doc.getRootElement()

String nameText = ((Text)XPath.selectSingleNode(root, "//name/text()")).getTextNormalize()

System.out.println(nameText)

}

}

下面是disks.xml源代码。你可以把name元素移动到xml文档的任意位置,它都可以找到。

<?xml version="1.0"?>

<disk>

<a>

<name1>name1</name1>

</a>

<b>

<name1><name>abcdefg</name></name1>

</b>

<c>

<name1>name2</name1>

</c>

<d>

<name1>name3</name1>

</d>

</disk>

如果还是不明白,你把你的邮箱告诉我,我把我的xml课件发给你。我是教Java的讲师,当然我也教XML。

import java.io.Fileimport java.io.FileNotFoundExceptionimport java.io.FileOutputStreamimport java.io.IOExceptionimport org.w3c.dom.*import org.xml.sax.SAXExceptionimport javax.xml.parsers.*import javax.xml.transform.*import javax.xml.transform.dom.DOMSourceimport javax.xml.transform.stream.*import javax.xml.xpath.*public class Test { public static void main(String[] args) {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() Element theBook=null, theElem=null, root=null try {factory.setIgnoringElementContentWhitespace(true) DocumentBuilder db=factory.newDocumentBuilder() Document xmldoc=db.parse(new File("Test1.xml")) root=xmldoc.getDocumentElement() theBook=(Element) selectSingleNode("/books/book[name='哈里波特']", root) System.out.println("--- 查询找《哈里波特》 ----") Element nameNode=(Element)theBook.getElementsByTagName("price").item(0)String name=nameNode.getFirstChild().getNodeValue()System.out.println(name) output(theBook) System.out.println("=============selectSingleNode(books/book[name='哈里波特'], root)==================") //--- 新建一本书开始 ----theBook=xmldoc.createElement("book") theElem=xmldoc.createElement("name") theElem.setTextContent("新书") theBook.appendChild(theElem) theElem=xmldoc.createElement("price") theElem.setTextContent("20") theBook.appendChild(theElem) theElem=xmldoc.createElement("memo") theElem.setTextContent("新书的更好看。") theBook.appendChild(theElem) root.appendChild(theBook) System.out.println("--- 新建一本书开始 ----") output(xmldoc) System.out.println("==============================") //--- 新建一本书完成 ----//--- 下面对《哈里波特》做一些修改。 ----//--- 查询找《哈里波特》---- //--- 此时修改这本书的价格 -----theBook.getElementsByTagName("price").item(0).setTextContent("15")//getElementsByTagName返回的是NodeList,所以要跟上item(0)。另外,getElementsByTagName("price")相当于xpath的".//price"。System.out.println("--- 此时修改这本书的价格 ----") output(theBook) //--- 另外还想加一个属性id,值为B01 ----theBook.setAttribute("id", "B01") System.out.println("--- 另外还想加一个属性id,值为B01 ----") output(theBook) //--- 对《哈里波特》修改完成。 ----//--- 要用id属性删除《三国演义》这本书 ----theBook=(Element) selectSingleNode("/books/book[@id='B02']", root) System.out.println("--- 要用id属性删除《三国演义》这本书 ----") output(theBook) theBook.getParentNode().removeChild(theBook) System.out.println("--- 删除后的XML ----") output(xmldoc) //--- 再将所有价格低于10的书删除 ----NodeList someBooks=selectNodes("/books/book[price<10]", root) System.out.println("--- 再将所有价格低于10的书删除 ---") System.out.println("--- 符合条件的书有 "+someBooks.getLength()+"本。 ---") for(int i=0i<someBooks.getLength()i++) {someBooks.item(i).getParentNode().removeChild(someBooks.item(i)) }output(xmldoc) saveXml("Test1_Edited.xml", xmldoc) } catch (ParserConfigurationException e) {e.printStackTrace() } catch (SAXException e) {e.printStackTrace() } catch (IOException e) {e.printStackTrace() }}public static void output(Node node) {//将node的XML字符串输出到控制台TransformerFactory transFactory=TransformerFactory.newInstance() try {Transformer transformer = transFactory.newTransformer() transformer.setOutputProperty("encoding", "gb2312") transformer.setOutputProperty("indent", "yes") DOMSource source=new DOMSource() source.setNode(node) StreamResult result=new StreamResult() result.setOutputStream(System.out) transformer.transform(source, result) } catch (TransformerConfigurationException e) {e.printStackTrace() } catch (TransformerException e) {e.printStackTrace() } }public static Node selectSingleNode(String express, Object source) {//查找节点,并返回第一个符合条件节点Node result=null XPathFactory xpathFactory=XPathFactory.newInstance() XPath xpath=xpathFactory.newXPath() try {result=(Node) xpath.evaluate(express, source, XPathConstants.NODE) } catch (XPathExpressionException e) {e.printStackTrace() }return result }public static NodeList selectNodes(String express, Object source) {//查找节点,返回符合条件的节点集。NodeList result=null XPathFactory xpathFactory=XPathFactory.newInstance() XPath xpath=xpathFactory.newXPath() try {result=(NodeList) xpath.evaluate(express, source, XPathConstants.NODESET) } catch (XPathExpressionException e) {e.printStackTrace() }return result }public static void saveXml(String fileName, Document doc) {//将Document输出到文件TransformerFactory transFactory=TransformerFactory.newInstance() try {Transformer transformer = transFactory.newTransformer() transformer.setOutputProperty("indent", "yes") DOMSource source=new DOMSource() source.setNode(doc) StreamResult result=new StreamResult() result.setOutputStream(new FileOutputStream(fileName)) transformer.transform(source, result) } catch (TransformerConfigurationException e) {e.printStackTrace() } catch (TransformerException e) {e.printStackTrace() } catch (FileNotFoundException e) {e.printStackTrace() } }} XML:<?xml version="1.0" encoding="GBK"?><books><book><name>哈里波特</name><price>10</price><memo>这是一本很好看的书。</memo></book><book id="B02"><name>三国演义</name><price>10</price><memo>四大名著之一。</memo></book><book id="B03"><name>水浒</name><price>6</price><memo>四大名著之一。</memo></book><book id="B04"><name>红楼</name><price>5</price><memo>四大名著之一。</memo></book></books>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11719158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存