`
txf2004
  • 浏览: 7065746 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

XML文件解析

阅读更多

在现在很多采用java开发的基于b\s结构的系统中,经常将一些配置参加放到一个xml文件中,然后在这个文件中取参数,这样减少了hard code的情况。下面这个类就是用来解析xml文件的。具体使用参考main方法的的写法。

/**
* filename: XMLProcess.java
* description: XML文件解析
* date: 2004-12-07
* @author sunlen
*
* History: // 历史修改记录
* <author> <time> <version > <desc>
*/


import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
import java.util.*;
import org.xml.sax.*;
import java.net.*;

public class XMLProcess
{

/** XML解析器工厂。*/
private static DocumentBuilderFactory factory;

/** XML解析器。*/
private static DocumentBuilder builder;

/** XML头。*/
private static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"gb2312\"?>";

/** 缩进前缀。*/
private static String indent = " ";

/** 该配置内存中数据是否与配置文件内容一致,不一致则为脏。*/
private boolean isDirty;

/** 代表该配置文件的文档类。*/
private Document doc;

/** 配置根节点。*/
private Element root;

/** 配置文件名。*/
private String file;

/**
* 创建配置读取对象。
* @param url 保存配置信息的XML文件路径。
*/
public XMLProcess(String url) throws IOException
{
this(url,false);
}

/**
* 创建配置读取对象。
* @param url 保存配置信息的XML文件路径。
* @param create 当配置文件不存在时,是否允许新建文件。
* @throws IOException 配置文件访问或内容解析异常。
*/
public XMLProcess(String url, boolean create) throws IOException
{

//得到配置信息
if (url==null)
{
throw new IllegalArgumentException("url is null");
}
if (url.indexOf(':')>1)
{
this.file = url;
}
else
{
this.file = new File(url).toURL().toString();
}

//为了检查参数file的合法性,如传的参数不合法,则抛出异常,调用者对其进行出错处理
new URL(this.file); //创建文件对象
try
{
load(); //读取配置文件
}
catch (FileNotFoundException ex)
{
if(!create)
{ //文件不存在,且不允许新建
throw ex;
}
else
{ //文件不存在,但允许新建
loadXMLParser(); //加载XML解析器
doc = builder.newDocument(); //创建空文档对象
root = doc.createElement("config");
doc.appendChild(root); //增加根节点
isDirty = true;
flush(); //保存到文件
return;
}
}
}

/**
* 输出缩进空格。
* @param pw 输出目的地。
* @param level 缩进深度。
*/
private static void writeIndent(PrintWriter pw,int level)
{
for (int i=0;i<level;i++)
{
pw.print(indent);
}
}

/**
* 以XML格式递归输出一个节点。
* @param node 输出起始节点。
* @param pw 输出目的地。
* @param 递归调用的深度标记,请输入0。
*/
private static void writeNode(Node node, PrintWriter pw, int deep)
{
switch (node.getNodeType())
{
case Node.COMMENT_NODE: //注释节点
writeIndent(pw,deep);
pw.print("<!--");
pw.print(node.getNodeValue());
pw.println("-->");
return;
case Node.TEXT_NODE: //文本节点
String value = node.getNodeValue().trim(); //文本trim防止破坏缩进格式
if (value.length()==0)
{
return;
}
writeIndent(pw,deep);
for (int i=0;i<value.length();i++)
{
char c = value.charAt(i);
switch(c)
{
case '<':
pw.print("&lt;");
break;
case '>':
pw.print("&lt;");
break;
case '&':
pw.print("&amp;");
break;
case '\'':
pw.print("&apos;");
break;
case '\"':
pw.print("&quot;");
break;
default:
pw.print(c);
}
}
pw.println();
return;
case Node.ELEMENT_NODE: //标记节点
if (!node.hasChildNodes())
{
return;
}
for (int i=0;i<deep;i++)
{
pw.print(indent);
}
String nodeName = node.getNodeName();
pw.print('<');
pw.print(nodeName);

//输出属性
NamedNodeMap nnm = node.getAttributes();
if (nnm!=null)
{
for (int i=0; i<nnm.getLength(); i++)
{
Node attr = nnm.item(i);
pw.print(' ');
pw.print(attr.getNodeName());
pw.print("=\"");
pw.print(attr.getNodeValue());
pw.print('\"');
}
}

//输出子节点
if (node.hasChildNodes())
{
NodeList children = node.getChildNodes();
if (children.getLength()==0)
{
pw.print('<');
pw.print(nodeName);
pw.println("/>");
return;
}
if (children.getLength()==1)
{
Node n = children.item(0);
if(n.getNodeType()==Node.TEXT_NODE)
{
String v = n.getNodeValue();
if (v!=null)
{
v = v.trim();
}
if (v==null||v.length()==0)
{
pw.println(" />");
return;
}
else
{
pw.print('>');
pw.print(v);
pw.print("</");
pw.print(nodeName);
pw.println('>');
return;
}
}
}
pw.println(">");
for (int i=0;i<children.getLength();i++)
{
writeNode(children.item(i),pw,deep+1);
}
for (int i=0;i<deep;i++)
{
pw.print(indent);
}
pw.print("</");
pw.print(nodeName);
pw.println(">");
}
else
{
pw.println("/>");
}
return;
case Node.DOCUMENT_NODE: //文档节点
pw.println(XML_HEAD);
NodeList nl= node.getChildNodes();
for (int i=0;i<nl.getLength();i++)
{
writeNode(nl.item(i),pw,0);
}
return;
}
}

/**
* 根据key指定的关键字查找节点,在查找的过程中顺便将不存在的节点创建出来。
* @param key 所查找节点的关键字。
* @return 返回查到的节点,没查到则返回null。
*/
public Node findNode(String key)
{
Node ancestor = root;
for (StringTokenizer st = new StringTokenizer(key,"/");
st.hasMoreTokens();)
{
String nodeName = st.nextToken();
NodeList nl = ancestor.getChildNodes();
for (int i=0; i<nl.getLength(); i++)
{
Node n = nl.item(i);
if (nodeName.equals(n.getNodeName()))
{
ancestor = n;

//到达key的最低一级了
if (!st.hasMoreTokens())
{
return n;
}
break;
}
}
}
return null;
}

/**
* 根据key指定的关键字创建节点,将会把key代表的整个路径上的节点都创建出来。
* @param key 所查找节点的关键字。
* @return 返回最底层节点,即使已经存在,没有创建新节点。
*/
private Node createNode(String key)
{
Node ancestor = root;
token:
for (StringTokenizer st = new StringTokenizer(key,"/");
st.hasMoreTokens();)
{
String nodeName = st.nextToken();
NodeList nl = ancestor.getChildNodes();
for (int i=0; i<nl.getLength(); i++)
{
Node n = nl.item(i);

//该级子节点存在则继续找下一级子节点
if (nodeName.equals(n.getNodeName()))
{
ancestor = n;
if (st.hasMoreTokens())
{
continue token;
}
else
{
return ancestor;
}
}
}

//该级子节点不存在
for(;;) //死循环
{
Node n = doc.createElement(nodeName);
ancestor.appendChild(n);
ancestor = n;
if(!st.hasMoreTokens())
{
return ancestor;
}
nodeName = st.nextToken();
}
}
return null; //不可能执行到这里
}

/**
* 根据key指定的关键字查找节点,在查找的过程中顺便将不存在的节点创建出来。
* @param ancestor 以该节点为祖先开始查找。
* @param key 所查找节点的关键字。
* @return 返回查到的节点,没查到则返回null。
*/
private Node createNode(Node ancestor, String key)
{

searchToken: //用来跳出两层循环用的标记
for (StringTokenizer st = new StringTokenizer(key,"/");
st.hasMoreTokens();)
{
String nodeName = st.nextToken();
NodeList nl = ancestor.getChildNodes();
for (int i=0; i<nl.getLength(); i++)
{
if (nodeName.equals(nl.item(i).getNodeName()))
{
ancestor = nl.item(i);
continue searchToken;
}
}
return null;
}
return ancestor;
}

/**
* 取名字为key的节点的值。如果该节点存在,但无内容则返回空字符串:""
* @param key 和该关键字关联的配置项的值将被返回。
* @param def 若key对应的配置项不存在,则返回该值。
* @exception NullPointerException key值为null。
*/
public String get(String key, String def)
{
if (key == null)
{
throw new NullPointerException("parameter key is null");
}

Node node = findNode(key);
if (node==null) //节点不存在返回空
{
return def;
}
NodeList nl = node.getChildNodes();
for (int i=0;i<nl.getLength();i++)
{
if (nl.item(i).getNodeType()==Node.TEXT_NODE)
{
return nl.item(i).getNodeValue().trim();
}
}
node.appendChild(doc.createTextNode(def));
return def;
}

/**
* 设名字为key的节点的值。
* @param key 设值节点对象的名字。
* @param value 所设的值。
* @exception NullPointerException 传入的key或value为null。
*/
public void put(String key, String value)
{
if (key == null)
{
throw new NullPointerException("parameter key is null");
}
if (value == null)
{
throw new NullPointerException("parameter value is null");
}
value = value.trim();
Node node = createNode(key);

//node节点的第一个文本子节点(不包括trim后为空的)放置该节点的值
NodeList nl = node.getChildNodes();
for (int i=0;i<nl.getLength();i++)
{
Node child = nl.item(i);
if (child.getNodeType()==Node.TEXT_NODE) //遇到第一个文本子节点
{
String childValue = child.getNodeValue();
if (childValue==null)
{
continue;
}
childValue = childValue.trim();
if (childValue.length()==0)
{
continue;
}

//put的值和原来一样,直接返回即可
if (childValue.equals(value))
{
return;
}
else
{
child.setNodeValue(value);
isDirty = true;
return;
}
}
}

//没有trim后还有内容的文本子节点
if (nl.getLength()==0) //节点为空
{
node.appendChild(doc.createTextNode(value));
}
else //节点非空
{
Node f = node.getFirstChild();
if (f.getNodeType()==Node.TEXT_NODE)
{
f.setNodeValue(value);
}
else
{
node.insertBefore(doc.createTextNode(value),f);
}
}
isDirty = true; //修改后,脏标记设为真
}

/**
* 取名字为key的节点的布尔值。
* @param key 取值节点对象的名字。
* @param def 若没有取到,则返回该值。
*/
public boolean getBoolean(String key, boolean def)
{
String str = String.valueOf(def); //把布尔型def变成字符串类str
boolean result;
String resstr = get(key,str);
Boolean resboolean = Boolean.valueOf(resstr);
result = resboolean.booleanValue();
return result;
}

/**
* 取名字为key的节点的整型值。
* @param key 取值节点对象的名字。
* @param def 若没有取到,则返回该值。
*/
public int getInt(String key,int def)
{
int result;
String str = String.valueOf(def);//把整型def变成字符串类str
String resstr = get(key,str);
try
{
result = Integer.parseInt(resstr);//把字符串类resstr变成整型result
}
catch(NumberFormatException e)
{
return def;
}
return result;
}

/**
* 取名字为key的节点的浮点值。
* @param key 取值节点对象的名字。
* @param def 若没有取到,则返回该值。
*/
public float getFloat(String key,float def)
{
float result;
String str = String.valueOf(def);//把浮点型def变成字符串类str
String resstr = get(key,str);
try
{
result = Float.parseFloat(resstr);//把字符串类resstr变成浮点型result
}
catch(NumberFormatException e)
{
return def;
}
return result;
}

/**
* 取名字为key的节点的双精度值。
* @param key 取值节点对象的名字。
* @param def 若没有取到,则返回该值。
*/
public double getDouble(String key,double def)
{
double result;

// 把double型def变成字符串类str
String str = String.valueOf(def);
String resstr = get(key,str);
try
{
// 把字符串类resstr变成double型result
result = Double.parseDouble(resstr);
}
catch(NumberFormatException e)
{
return def;
}
return result;
}

/**
* 取名字为key的节点的长整型值。
* @param key 取值节点对象的名字。
* @param def 若没有取到,则返回该值。
*/
public long getLong(String key,long def)
{
long result;
String str = String.valueOf(def);//把long型def变成字符串类str
String resstr = get(key,str);
try
{
result = Long.parseLong(resstr);//把字符串类resstr变成long型result
}
catch(NumberFormatException e)
{
return def;
}
return result;
}

/**
* 取名字为key的节点的字节数组值。
* @param key 取值节点对象的名字。
* @param def 若没有取到,则返回该值。
*/
public byte[] getByteArray(String key,byte[] def)
{
byte[] result;
String str = new String(def);//把byte[]型def变成字符串类str
String resstr = get(key,str);
result = resstr.getBytes();//把字符串类resstr变成byte[]型result
return result;
}

/**
* 设名字为key的节点的布尔型值。
* @param key 设值节点对象的名字。
* @param value 所设的值。
*/
public void putBoolean(String key, boolean value)
{
String str = String.valueOf(value); //将boolean型转换成String类型
try
{
put(key,str);
}
catch(RuntimeException e)
{
throw e;
}
}

/**
* 设名字为key的节点的整型值。
* @param key 设值节点对象的名字。
* @param value 所设的值。
*/
public void putInt(String key,int value)
{
String str = String.valueOf(value); //将int型转换成String类型
try
{
put(key,str);
}
catch(RuntimeException e)
{
throw e;
}
}

/**
* 设名字为key的节点的浮点型值。
* @param key 设值节点对象的名字。
* @param value 所设的值。
*/
public void putFloat(String key,float value)
{
String str = String.valueOf(value); //将float型转换成String类型
try
{
put(key,str);
}
catch(RuntimeException e)
{
throw e;
}
}

/**
* 设名字为key的节点的双精度型值。
* @param key 设值节点对象的名字。
* @param value 所设的值。
*/
public void putDouble(String key,double value)
{
String str = String.valueOf(value); //将double型转换成String类型
try
{
put(key,str);
}
catch(RuntimeException e)
{
throw e;
}
}

/**
* 设名字为key的节点的长整型值。
* @param key 设值节点对象的名字。
* @param value 所设的值。
*/
public void putLong(String key,long value)
{
String str = String.valueOf(value); //将long型转换成String类型
try
{
put(key,str);
}
catch(RuntimeException e)
{
throw e;
}
}

/**
* 删除某个节点。
* @param key 该节点的名称。
*/
public void removeNode(String key)
{
Node node = findNode(key); //查找该节点
if (node==null) //该节点不存在
{
return;
}
Node parentnode = node.getParentNode(); //取父节点
if (parentnode != null)
{
parentnode.removeChild(node); //删掉该节点
isDirty = true; //脏标志设为真
}
}

/**
* 清理某节点的所有子节点。
* @param key 该节点的名称。
*/
public void clear(String key)
{
Node node = findNode(key);//查找该节点
if (node == null) //未找到就抛出异常
{
throw new RuntimeException("InvalidName");
}
Node lastnode = null;

//依次把最后一个子节点清除
while (node.hasChildNodes())
{
lastnode = node.getLastChild();
node.removeChild(lastnode);
}

//若有子节点被清除,脏标志设为真
if (lastnode != null)
{
isDirty = true;
}
}

/**
* 查找某节点下的所有子节点的名字。
* @param key 被查节点的名字。
* @return String[] 子节点名字的字符串数组,如果不存在key对应的子节点,
* 则返回长度为0的空数组。
*/
public String[] childrenNames(String key)
{
Node node = findNode(key); //查找key节点
if (node==null)
{
return new String[0];
}
NodeList nl = node.getChildNodes();
LinkedList list = new LinkedList();
for (int i=0;i<nl.getLength();i++)
{
Node child = nl.item(i);
if (child.getNodeType()==Node.ELEMENT_NODE
&& child.hasChildNodes())
{
list.add(child.getNodeName());
}
}
String[] ret = new String[list.size()];
for (int i=0;i<ret.length;i++)
{
ret[i] = (String)list.get(i);
}
return ret;
}

/**
* 判断某个节点是否存在。
* @param key 被查节点的全名。
* @return true 节点存在返回true,节点不存在返回false。
*/
public boolean nodeExist(String key)
{
Node theNode = this.findNode(key);
if (theNode == null)
{
return false;
}
else if ( theNode.hasChildNodes())
{
return true;
}
else
{
return false;
}
}

/**
* 加载XML解析器驱动程序。
*/
private void loadXMLParser() throws IOException
{
//如果尚未加载过,则加载XML解析器驱动程序
if (builder == null)
{
try
{
factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
builder = factory.newDocumentBuilder();
}
catch (ParserConfigurationException ex)
{
throw new IOException("XML Parser load error:" +
ex.getLocalizedMessage());
}
}
}

/**
* 重新读取XML文件。
*/
public void load() throws IOException
{
loadXMLParser();

//解析配置文件
try
{
this.doc = builder.parse(file);
}
catch (SAXException ex)
{
ex.printStackTrace();
String message = ex.getMessage();
Exception e = ex.getException();
if (e!=null)
{
message += "embedded exception:" + e;
}
throw new IOException("XML file parse error:" + message);
}
root = doc.getDocumentElement();
/*
if (!"config".equals(root.getNodeName()))
{
throw new IOException("Config file format error, " +
"root node must be <config>");
}
*/
}

/**
* 把配置写进配置文件。
*/
public void flush() throws IOException
{
if(isDirty) //如果配置发生过修改
{
String proc = new URL(this.file).getProtocol().toLowerCase();
if (!proc.equalsIgnoreCase("file"))
{
throw new UnsupportedOperationException(
"Unsupport write config URL on protocal " + proc);
}
String fileName = new URL(this.file).getPath();
BufferedOutputStream bos = new BufferedOutputStream
(new FileOutputStream(fileName),2048);
PrintWriter pw = new PrintWriter(bos);
writeNode(doc,pw,0);//输出整个文档
pw.flush();
pw.close();
isDirty = false; //脏标志设为假
}
}

/**
* 将字符串中的大于号、小于号等特殊字符做转义处理。
* @param str 转义前字符串。
* @return 转义后的字符串。
*/
private String change(String str) throws IOException
{
if (str.indexOf('&')!=-1 || str.indexOf('<')!=-1
|| str.indexOf('>')!=-1)
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ByteArrayInputStream bis = new ByteArrayInputStream(str.getBytes());
byte temp;
byte[] ba1 = {'&','a','m','p',';'};
byte[] ba2 = {'&','l','t',';'};
byte[] ba3 = {'&','g','t',';'};
while( (temp = (byte)bis.read()) != -1 )
{
switch (temp)
{
case '&':
bos.write(ba1);
break;
case '<':
bos.write(ba2);
break;
case '>':
bos.write(ba3);
break;
default:
bos.write(temp);
}
}
return bos.toString();
}
return str; //不含有需转义的字符,则直接将原字符串返回
}

/**
* 取得CommonService配置的地址。
* @return 字符串类型的二维数组。
*/
public String[][] getServerAddrs()
{
int arrLength = childrenNames("common/aplComs/addrs").length;
String[][] aplArr= new String[arrLength][2];
if (arrLength==0)
{
return null;
}

for (int i=0;i<arrLength;i++)
{
String ip = this.get("common/aplComs/addrs/addr" + (i+1)+ "/ip","");
String port = this.get("common/aplComs/addrs/addr" + (i+1) + "/port","");
aplArr[i][0]= ip;
aplArr[i][1]= port;
}
return aplArr;
}

/**
* 取得系统监控配置的监控路径。
* @return 字符串类型的数组。
*/
public String[] getMonitorPath()
{
int arrLength = childrenNames("common/systemMonitor/paths").length;
String[] pathArr= new String[arrLength];
if (arrLength==0)
{
return null;
}

for (int i=0;i<arrLength;i++)
{
String path = this.get("common/systemMonitor/paths/path" + (i+1),"");
pathArr[i]= path;
}
return pathArr;
}

/**
* 测试入口。
*/
public static void main(String[] args) throws Exception
{
/*
c = new Cfg("testcfg.xml",true);
c.put("a/b","汉字");
c.put("c","");
c.put("a","avalusaaaaaaaaae");
c.flush();
System.out.println(" Config file content:");
BufferedReader in = new BufferedReader(new FileReader("testcfg.xml"));
String line;
while((line=in.readLine())!=null)
{
System.out.println(line);
}
*/
XMLProcess c = new XMLProcess("testcfg.xml",false);
/*String[] arr = c.childrenNames("common/logConfig");
for(int i = 0;i < arr.length;i++)
{
System.out.println("arr" + i + "=" + arr[i]);
}*/
/*c.clear("common/aplComs/addrs/addr3");
c.flush();*/
/*Node n = c.findNode("common/aplComs/addrs/addr3");*/
/*c.isDirty=true;
c.flush();*/
/*System.out.println(c.get(null,"def"));*/
/*System.out.println(c.getBoolean("common/logConfig/logLevel",false));*/
/*byte[] arr = c.getByteArray("common/logConfig/logLevel","aaa".getBytes());
for(int i = 0;i < arr.length;i++)
{
System.out.println("arr" + i + "=" + arr[i]);
System.out.println((char) arr[i]);
}
System.out.println(new String(arr));
System.out.println((char)110);
System.out.println((byte)'a');*/
/*System.out.println(c.getDouble("common/logConfig/maxLogFileLength",1));*/
/*System.out.println(c.getFloat("common/logConfig/maxLogFileLength",1));*/
/*System.out.println(c.getInt("common/logConfig/maxLogFileLength",1));*/
/*System.out.println(c.getLong("common/logConfig/maxLogFileLength",1));*/
/*String[] arr = (c.getMonitorPath());
if(arr != null)
{
for(int i = 0;i < arr.length;i++)
{
System.out.println("arr" + i + "=" + arr[i]);
}
}
else
{
System.out.println("arr=null");
}*/
/*String[][] arr = c.getServerAddrs();
if(arr != null)
{
for(int i = 0;i < arr.length;i++)
{
System.out.println("ip" + i + "=" + arr[i][0]);
System.out.println("port" + i + "=" + arr[i][1]);
}
}
else
{
System.out.println("arr=null");
}*/
/*c.load();*/
/*System.out.println(c.nodeExist("wskf"));*/
c.put("common/logConfig/logLevel","warn");
c.flush();
}
}

分享到:
评论

相关推荐

    XML文档解析相关工具

    2. **SAX解析**:除了DOM,dom4j还支持SAX(Simple API for XML)解析器,适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 3. **XPath支持**:dom4j内置了XPath引擎,可以使用XPath表达式方便地定位...

    用C++语言实现XML文件解析的一种方案

    ### 用C++语言实现XML文件解析的一种方案 #### 概述 随着互联网技术的不断发展,XML(可扩展标记语言)作为一种重要的数据交换格式,在各领域中的应用日益广泛。XML以其良好的可读性和开放性成为了数据共享的标准...

    C++ XML文件解析库 tinyxml2

    1. **XML解析**:TinyXML2通过`XMLDocument`类来表示整个XML文档,你可以使用`LoadFile()`或`Parse()`方法加载XML文件或内存中的XML字符串。解析完成后,文档的结构被映射为一系列的节点,包括元素(XMLElement)、...

    XML文件解析代码

    XML文件解析工具类

    C写的解析xml文件源代码

    本文将深入探讨使用C语言编写的XML文件解析源码,并讲解如何实现XML文件的基本操作,如查找、增加和删除节点。 在C语言中处理XML文件通常涉及到以下几个关键步骤: 1. **内存管理**:由于C语言没有内置的高级数据...

    XML文件解析问题.pdf

    XML 文件解析问题 XML 文件解析是指将 XML 文件转换为可被计算机理解和处理的格式。XML 文件解析问题是指在解析 XML 文件时遇到的问题,例如解析速度慢、内存占用高、解析错误等。 在 XML 文件解析中,主要有两种...

    Tinyxml文件解析经典例子

    Tinyxml 文件解析经典例子 TinyXML 是一个开源的解析 XML 的解析库,能够用于 C++,能够在 Windows 或 Linux 中编译。这个解析库的模型通过解析 XML 文件,然后在内存中生成 DOM 模型,从而让我们很方便的遍历这棵...

    xml 文件解析专题

    在IT行业中,XML文件解析是一项基础且重要的技能,尤其在数据交换、配置文件、Web服务等领域有着广泛的应用。本专题将深入探讨XML文件解析的相关知识点。 一、XML基本结构 XML文档由元素(Elements)、属性...

    xml.rar_XML 文档 解析_XML 解析_XML文档

    这个"xml.rar"压缩包包含了一系列与XML文档解析相关的源代码文件,对于初学者来说,是理解XML解析机制的一个很好的实例。 1. **XML文档结构**: XML文档由一系列元素组成,每个元素通过开始标签 `&lt;tag&gt;` 和结束...

    VC xml文件解析类

    C++作为一款强大的编程语言,虽然原生并不支持XML处理,但可以通过第三方库或者自定义类来实现XML文件的解析和读取。"VC XML文件解析类"就是这样的一个实现,它提供了C++程序员处理XML文件的能力。 首先,我们来看`...

    XmlPullParser解析Xml文件解析demo

    XmlPullParser是Android系统提供的一种解析XML文件的API,它是一种基于事件驱动的解析方式,能够高效、节省资源地处理XML文档。在这个“XmlPullParser解析Xml文件解析demo”中,我们将探讨如何利用XmlPullParser来...

    xml文件解析工厂

    XML文件解析工厂则是处理XML文档的核心工具,它简化了对XML数据的操作,使得开发者能够更加高效地读取、写入和处理XML内容。 在Java中,XML文件解析主要有DOM(Document Object Model)、SAX(Simple API for XML)...

    xml文件解析源码

    TinyXML和TinyXML2是两个小型、轻量级的C++库,专门用于解析和操作XML文件。它们提供了简单的API,使得开发者能够方便地读取、修改和创建XML文档。 TinyXML库是最初的版本,它为XML解析提供了一个易于使用的接口。 ...

    基于C++的xml文档解析器源代码

    本资源提供了基于C++的XML文档解析器的源代码,涵盖了读取、遍历、查找、插入和保存等基本功能,对于学习和理解XML解析原理以及C++编程技巧具有很高的参考价值。 首先,XML文档的基本结构包括元素(Element)、属性...

    XML文件解析编辑小工具

    "XML文件解析编辑小工具",如firstobject xml editor 2.4,是一款专为XML文档设计的轻量级编辑器,提供了对XML文件的深度解析和编辑功能。 这款工具的特色在于其绿色小巧的特性,意味着它无需安装即可使用,占用...

    基于QT的XML文件解析器

    QDomDocument提供了一个完整的DOM(文档对象模型)解析器,它将整个XML文件加载到内存中,形成一棵树形结构,便于遍历和操作。而QXmlStreamReader则采用事件驱动的方式,逐行读取XML文件,适用于处理大文件或需要低...

    java xml文件解析

    在Java中,有多种解析XML文件的方式,包括DOM (Document Object Model)、SAX (Simple API for XML) 和 DOM4J。这些方法各有优势和局限性,选择哪一种取决于具体的应用场景和需求。 #### 二、DOM 解析方式 DOM 解析...

    pomxml文件解析

    pomxml文件解析pomxml文件解析pomxml文件解析

    四中最常用的XML文件解析总结.doc

    对于XML文件的解析,掌握几种常用的方法是至关重要的。根据给定文件的信息,我们将深入探讨四种最常用的XML文件解析技术:DOM(Document Object Model)、SAX(Simple API for XML)、STAX(Streaming API for XML)...

    xml解析文件的两种方式

    - 内存消耗大:对于大型XML文件,DOM可能会消耗大量内存,因为它需要一次性加载整个文档。 - 性能问题:由于需要构建完整的DOM树,解析速度相对较慢。 **2. SAX解析** SAX(Simple API for XML)是一种事件驱动的...

Global site tag (gtag.js) - Google Analytics