作为一个小白,代码写久了以前看不懂的东西现在懂了好多,今天花了一些时间在网上看关于XML的解析,然后自己手写模仿一下(笑)
耐心写完发现并不难,有益于提升自信2333。
废话少说,下面是正题:
首先附上XML文件,文件名为mine.xml(一股萌新的味道…)
<?xml version="1.0" encoding="UTF-8"?>
<foodStore>
<food id="1">
<name>包子</name>
<pi>包子皮</pi>
<xian>包子馅儿</xian>
</food>
<food id="2">
<name>饺子</name>
<pi>饺子皮</pi>
<xian>饺子馅儿</xian>
</food>
</foodStore>
不要在意标签名儿,中国人应该都能看懂(笑……)。下面时JAVA代码:
public static void main(String[] args)
{
//dom解析xml方法
GetXmlByDom();
//JDom解析xml方法
GetXmlByJDom();
//dom4j解析xml方法
GetXmlByDom4J();
}
/*
* dom解析xml
* 数据比较多时耗费内存,要求性能
* 建议用以解析简单的xml
*
* */
public static void GetXmlByDom()
{
System.out.println("DOM解析:----------开始----------");
//DocumentBuilderFactory对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
try {
//创建一个DocumentBuilder对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//加载xml
//Document引用org.w3c.dom
Document document = documentBuilder.parse("./resource/mine.xml");
//获取mine.xml里每一个food节点
NodeList foodList = document.getElementsByTagName("food");
System.out.println("DOM解析:一共有"+foodList.getLength()+"种食物..");
System.out.println("DOM解析:以下为FoodStore里详细表单:");
//遍历food节点
for(int i=0;i<foodList.getLength();i++)
{
System.out.println("DOM解析:----------第"+(i+1)+"种食物:----------");
//获取对应food节点
Node food = foodList.item(i);
//获取每一个food节点下的属性
NamedNodeMap foodMore = food.getAttributes();
System.out.println("DOM解析:有"+foodMore.getLength()+"个属性:");
//遍历food里的属性
//属性并非子节点
for (int k = 0;k<foodMore.getLength();k++)
{
Node attr = foodMore.item(k);
System.out.println("DOM解析:属性名:"+attr.getNodeName()+",属性值:"+attr.getNodeValue());
}
//解析子节点
//获取子节点列表,返回为NodeList类型的数据
NodeList childNodes = food.getChildNodes();
System.out.println("DOM解析:有"+childNodes.getLength()+"个子节点");
for (int j=0;j<childNodes.getLength();j++)
{
//区分节点类型(text,element)
if (childNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
{
System.out.println("DOM解析:第"+j+"个子节点属性名:"+childNodes.item(j).getNodeName()+";属性值:"+childNodes.item(j).getFirstChild().getNodeValue());
}
}
}
System.out.println("DOM解析:----------结束----------");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* JDOM解析
* 需要JDom的jar包
*/
public static void GetXmlByJDom()
{
System.out.println("JDOM解析:----------开始----------");
ArrayList<Food> foodList = new ArrayList<Food>();
//创建一个SAXBuilder对象
//需要JDOM.jar
SAXBuilder saxBuilder = new SAXBuilder();
InputStream inputStream;
try {
//将xml加载到输入流
inputStream = new FileInputStream("./resource/mine.xml");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
//将输入流加载到saxBuilder中
org.jdom.Document document = saxBuilder.build(inputStream);
//根据document获取xml根节点
Element element = document.getRootElement();
//获取根节点下的子节点List
List<Element> myFoodList = element.getChildren();
//xml-->输入流-->saxBuilder-->Document-->List
//解析
for(Element food:myFoodList)
{
Food foodBean = new Food();
System.out.println("JDOM解析:----------第"+(myFoodList.indexOf(food)+1)+"种食物----------");
//遍历属性
List<Attribute> attributes = food.getAttributes();
for (Attribute attribute:attributes)
{
//属性名
String attrName = attribute.getName();
//属性值
String attrValue = attribute.getValue();
System.out.println("JDOM解析:属性名:"+attrName+",属性值:"+attrValue);
//为food对象的id属性赋值
if (attrName.equals("id"))
{
foodBean.setId(attrValue);
}
}
//遍历子节点
List<Element> elements = food.getChildren();
for (Element ele : elements)
{
System.out.println("JDOM解析:子节点名:"+ele.getName()+",子节点值:"+ele.getValue());
//假装是给foodbean赋值的代码...
}
}
System.out.println("JDOM解析:----------结束----------");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* DOM4J解析
* Sun都在用的解析啊!
* 别问了,它哪儿都好(笑哭)
* 记得引用DOM4J的jar包!(严肃脸)
* */
public static void GetXmlByDom4J()
{
System.out.println("DOM4J解析:----------开始----------");
//还是解析mine,xml文件
//创建SAXReader对象
SAXReader saxReader = new SAXReader();
try {
//读取mine.xml文件,并赋给document
org.dom4j.Document document = saxReader.read("./resource/mine.xml");
//再获取根节点,有没有觉得一丝丝熟悉(笑)
org.dom4j.Element element = document.getRootElement();
//迭代器
Iterator iterator = element.elementIterator();
//遍历迭代器,获取根节点中的信息
while (iterator.hasNext())
{
org.dom4j.Element food = (org.dom4j.Element)iterator.next();
//获取属性
List<org.dom4j.Attribute> attributes = food.attributes();
for (org.dom4j.Attribute attribute:attributes)
{
System.out.println("DOM4J解析:属性名:"+attribute.getName()+",DOM4J解析:属性值:"+attribute.getValue());
}
//获取子节点
Iterator iterator1 = food.elementIterator();
while (iterator1.hasNext())
{
org.dom4j.Element foodChild = (org.dom4j.Element) iterator1.next();
System.out.println("DOM4J解析:子节点名:"+foodChild.getName()+",DOM4J解析:子节点值:"+foodChild.getStringValue());
}
if (iterator.hasNext())
{
System.out.println("DOM4J解析:--------------------------------------------");
}
}
System.out.println("DOM4J解析:----------结束----------");
} catch (DocumentException e) {
e.printStackTrace();
}
}
以下是一些补充:
1/关于io流,记得加try catch
2/JDOM和DOM4J需要下载导入相应的jar包
3/关于什么Element、Document这些类,用哪个方法就要用哪个jar包里对应的类
然后是最重要的一条补充:
原文网址:P
https://www.cnblogs.com/longqingyang/p/5577937.html