附加new.xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<language>
<lan id="1">
<name>Java</name>
<ide>Eclipse</ide>
</lan>
<lan id="2">
<name>Swift</name>
<ide>XCode</ide>
</lan>
<lan id="3">
<name>C#</name>
<ide>Visual Studio</ide>
</lan>
</language>
第一创建.xml文件
import java.io.File;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class CreateXML {
public static void main(String[] args) {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=null;
try {
builder = factory.newDocumentBuilder();
Document document=builder.newDocument();
Element root=document.createElement("language");
Element lan1=document.createElement("lan");
lan1.setAttribute("id","1");
Element name1=document.createElement("name");
name1.setTextContent("Java");
Element ide1=document.createElement("ide");
ide1.setTextContent("Eclipse");
lan1.appendChild(name1);
lan1.appendChild(ide1);
root.appendChild(lan1);
Element lan2=document.createElement("lan");
lan2.setAttribute("id","2");
Element name2=document.createElement("name");
name2.setTextContent("Swift");
Element ide2=document.createElement("ide");
ide2.setTextContent("XCode");
lan2.appendChild(name2);
lan2.appendChild(ide2);
root.appendChild(lan2);
Element lan3=document.createElement("lan");
lan3.setAttribute("id","3");
Element name3=document.createElement("name");
name3.setTextContent("C#");
Element ide3=document.createElement("ide");
ide3.setTextContent("Visual Studio");
lan3.appendChild(name3);
lan3.appendChild(ide3);
root.appendChild(lan3);
document.appendChild(root);
TransformerFactory tf=TransformerFactory.newInstance();
Transformer t=tf.newTransformer();
// StringWriter sw=new StringWriter();
t.transform(new DOMSource(document), new StreamResult(new File("newXML.xml")));
// System.out.print(sw);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
除了生成文件外,还可以直接打印在控制台。
只需把
new StreamResult(new File("newXML.xml"))
改为
StringWriter sw=new StringWriter();
t.transform(new DOMSource(document), new StreamResult(sw));
System.out.print(sw);
然后就是读取.xml文件中的内容 。
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class CreateXML
{
public static void main(String[] args)
{
try {
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document d=db.parse(new File("newXML.xml"));
Element root=d.getDocumentElement();
System.out.println(root.getNodeName());
NodeList list=root.getElementsByTagName("lan");
for(int n=0;n<list.getLength();++n)
{
Element no= (Element) list.item(n);
System.out.println(no.getTagName()+" "+"id="+no.getAttribute("id"));
NodeList li=no.getChildNodes();
for(int va=0;va<li.getLength();++va)
{
Node ele= li.item(va);
if(ele instanceof Element)
System.out.println(ele.getNodeName()+" "+ele.getTextContent());
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里是读取出来,并且打印在控制台上。
然后就是,利用外部工具dom4j来打印
String xml="<lang><peo>Jerry</peo></lang>";
Document dom;
try {
dom = DocumentHelper.parseText(xml);
System.out.println(dom.asXML());
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dom4j更多的用法希望读者自行解压dom4j安装包后,打开docs/index.html自行查阅。
还有就是通过XPath来定位信息,简化很多操作,不需要一层层遍历下去。
核心代码:(这个可以直接模仿的)
XPathFactory xpf=XPathFactory.newInstance();
XPath xp= xpf.newXPath();
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
org.w3c.dom.Document d=db.parse(new File("newXML.xml"));
System.out.println(xp.evaluate("/language/lan2/name", d));
这里所使用的newXML.xml文件已经被我稍作更改:(目的就是为了直接定位Swift,把lan改为lan2)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<language>
<lan id="1">
<name>Java</name>
<ide>Eclipse</ide>
</lan>
<lan2 id="2">
<name>Swift</name>
<ide>XCode</ide>
</lan2>
<lan id="3">
<name>C#</name>
<ide>Visual Studio</ide>
</lan>
</language>
这里需要注意的是:若有多个相同的标签,比如lan,定位的结果是第一个标签。
而你若是真心想要找到这些全部相同的标签,可以试试这个方法:
XPathFactory xpf=XPathFactory.newInstance();
XPath xp= xpf.newXPath();
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
org.w3c.dom.Document d=db.parse(new File("newXML.xml"));
NodeList nodes=(NodeList) xp.evaluate("/language/lan/name", d,XPathConstants.NODESET);
for(int k=0;k<nodes.getLength();++k)
{
System.out.println(nodes.item(k).getTextContent());
}
返回了一个NodeList,然后就直接遍历。
在此基础上,还想更加简单,还有个地方可以优化:
System.out.println(xp.evaluate("//lan2/name", d));
表示从整个xml文档中查找,而不考虑当前节点位置。
符号 | 说明 | 示例 | 示例说明 |
/ | 表示从根节点开始选择 | /pets | 选择根节点pets |
表示节点和子节点之间的间隔符 | /pets/dog | 选择pets节点下的dog节点 | |
//xx | 表示从整个xml文档中查找,而不考虑当前节点位置 | //price | 选择文档中所有的price节点 |
. | 单个英文半角句点表示选择当前节点 | /pets/. | 选择pets节点 |
.. | 双点,表示选择父节点 | /pets/dog[0]/.. | 表示pets节点,也就是第一个dog节点的父节点 |
@xx | 表示选择属性 | //dog/@color | 表示选择所有dog节点的color属性集合 |
[…] | 中括号表示选择条件,括号内为条件 | //dog[@color=’white’] | 所有color为white的dog节点 |
//dog[/price<100] | 所有price字节点值小于100的dog节点 | ||
中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的 | //dog[1] | 第1个dog节点 | |
//dog[last()] | 最后一个dog节点,last()是xPath内置函数 | ||
| | 单竖杠表示合并节点结合 | //dog[@color=’white’] | //cat[@color=’white’] | color属性为white的dog节点和color属性为white的cat节点 |
* | 星号表示任何名字的节点或者属性 | //dog/* | 表示dog节点的所有子节点 |
//dog/@* | 表示dog节点的所有属性节点 |