
xml是类似这种的:
<xml version="10" encoding="gbk">
<head></head>
<body></body>
可以在节点中加属性例如:
<body id = "" name = ""></body>
java代码解析一般用DOM4j分两种类型的解析方式:
1DOM: Document Object Model 文档对象模型
树形结构装载到内存中完成后才开始解析
缺点:如果文件比较大,内存有压力,时间会延迟
优点:可以对树形结构做任何 *** 作:加节点,删节点,遍历
2SAX: Simple API for XML
流(Stream)的特征,解析可以立即开始
不保存数据 对内存无压力不能修改节点
适合大文件的解析
下面附上代码:
public static List<String> parseCustomXML(String fileName) {
// 定义解析器
SAXReader saxReader = new SAXReader();
List<String> eleList = new ArrayList<String>();
// 开始解析,返回文档对象
/
<root>
<msg>
<element totalLenghtorder = "1" totalLenghtlenght = "8">totalLenght</element>
<element totalLenghtorder = "2" totalLenghtlenght = "8">bodyLenght</element>
<element jydmorder = "3" jydmlenght = "6">jydm</element>
<element msgTypeorder = "4" msgTypelenght = "2">msgType</element>
<element sendSignorder = "5" sendSignlenght = "1">sendSign</element>
<element msgCheckCodeorder = "6" msgCheckCodelenght = "32">msgCheckCode</element>
<element serviceNameorder = "7" serviceNamelenght = "8">serviceName</element>
<element msgAgreementorder = "8" msgAgreementlenght = "1">msgAgreement</element>
<element cprqorder = "9" cprqlenght = "8">cprq</element>
<element fkrzhorder = "10" fkrzhlenght = "20">fkrzh</element>
<element pjhmorder = "11" pjhmlenght = "8">pjhm</element>
<element jeorder = "12" jelenght = "20">je</element>
<element zfmmorder = "13" zfmmlenght = "20">zfmm</element>
<element jghorder = "14" jghlenght = "20">jgh</element>
<element yhdmorder = "15" yhdmlenght = "20">yhdm</element>
</msg>
</root>
/
try {
Document doc = saxReaderread(new File(fileName));
Element root = docgetRootElement();// 获取根节点
Element msg = rootelement("msg");
Iterator itEle = msgelementIterator("element");// 遍历msg节点下的所有element节点
while (itElehasNext()) {
Element element = (Element) itElenext();
String value = elementgetText();
//测试
Systemoutprintln(value);
eleListadd(value);
Iterator itAttr = elementattributeIterator();// 遍历每一个element节点的所有属性
while (itAttrhasNext()) {
Attribute attr = (Attribute) itAttrnext();
//String keyAttr = attrgetName();
String valueAttr = attrgetValue();
//测试
Systemoutprintln(valueAttr);
eleListadd(valueAttr);
}
}
} catch (DocumentException e) {
eprintStackTrace();
}
return eleList;
}
有不明白的 在帮你分析
public class ReadFromFile {
/
以字节为单位读取文件,常用于读二进制文件,如、声音、影像等文件。
/
public static void readFileByBytes(String fileName) {
File file = new File(fileName);
InputStream in = null;
try {
Systemoutprintln("以字节为单位读取文件内容,一次读一个字节:");
// 一次读一个字节
in = new FileInputStream(file);
int tempbyte;
while ((tempbyte = inread()) != -1) {
Systemoutwrite(tempbyte);
}
inclose();
} catch (IOException e) {
eprintStackTrace();
return;
}
try {
Systemoutprintln("以字节为单位读取文件内容,一次读多个字节:");
// 一次读多个字节
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFileshowAvailableBytes(in);
// 读入多个字节到字节数组中,byteread为一次读入的字节数
while ((byteread = inread(tempbytes)) != -1) {
Systemoutwrite(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1printStackTrace();
} finally {
if (in != null) {
try {
inclose();
} catch (IOException e1) {
}
}
}
}
/
以字符为单位读取文件,常用于读文本,数字等类型的文件
/
public static void readFileByChars(String fileName) {
File file = new File(fileName);
Reader reader = null;
try {
Systemoutprintln("以字符为单位读取文件内容,一次读一个字节:");
// 一次读一个字符
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = readerread()) != -1) {
// 对于windows下,\r\n这两个字符在一起时,表示一个换行。
// 但如果这两个字符分开显示时,会换两次行。
// 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
if (((char) tempchar) != '\r') {
Systemoutprint((char) tempchar);
}
}
readerclose();
} catch (Exception e) {
eprintStackTrace();
}
try {
Systemoutprintln("以字符为单位读取文件内容,一次读多个字节:");
// 一次读多个字符
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
// 读入多个字符到字符数组中,charread为一次读取字符数
while ((charread = readerread(tempchars)) != -1) {
// 同样屏蔽掉\r不显示
if ((charread == tempcharslength)
&& (tempchars[tempcharslength - 1] != '\r')) {
Systemoutprint(tempchars);
} else {
for (int i = 0; i < charread; i++) {
if (tempchars[i] == '\r') {
continue;
} else {
Systemoutprint(tempchars[i]);
}
}
}
}
} catch (Exception e1) {
e1printStackTrace();
} finally {
if (reader != null) {
try {
readerclose();
} catch (IOException e1) {
}
}
}
}
/
以行为单位读取文件,常用于读面向行的格式化文件
/
public static void readFileByLines(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
try {
Systemoutprintln("以行为单位读取文件内容,一次读一整行:");
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
// 一次读入一行,直到读入null为文件结束
while ((tempString = readerreadLine()) != null) {
// 显示行号
Systemoutprintln("line " + line + ": " + tempString);
line++;
}
readerclose();
} catch (IOException e) {
eprintStackTrace();
} finally {
if (reader != null) {
try {
readerclose();
} catch (IOException e1) {
}
}
}
}
/
随机读取文件内容
/
public static void readFileByRandomAccess(String fileName) {
RandomAccessFile randomFile = null;
try {
Systemoutprintln("随机读取一段文件内容:");
// 打开一个随机访问文件流,按只读方式
randomFile = new RandomAccessFile(fileName, "r");
// 文件长度,字节数
long fileLength = randomFilelength();
// 读文件的起始位置
int beginIndex = (fileLength > 4) 4 : 0;
// 将读文件的开始位置移到beginIndex位置。
randomFileseek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
// 一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
// 将一次读取的字节数赋给byteread
while ((byteread = randomFileread(bytes)) != -1) {
Systemoutwrite(bytes, 0, byteread);
}
} catch (IOException e) {
eprintStackTrace();
} finally {
if (randomFile != null) {
try {
randomFileclose();
} catch (IOException e1) {
}
}
}
}
/
显示输入流中还剩的字节数
/
private static void showAvailableBytes(InputStream in) {
try {
Systemoutprintln("当前字节输入流中的字节数为:" + inavailable());
} catch (IOException e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/temp/newTemptxt";
ReadFromFilereadFileByBytes(fileName);
ReadFromFilereadFileByChars(fileName);
ReadFromFilereadFileByLines(fileName);
ReadFromFilereadFileByRandomAccess(fileName);
}
}
十分像HTML, 也是一层一层,在主要信息外面包一些报头。XML 被设计用来传输和存储数据,但本身是不工作的,只是一种结构。
一边是document 信息,另一边是协同的schema contract。
如需规定一个时区,您也可以通过在日期后加一个 "Z" 的方式,使用世界调整时间(UTC time)来输入一个日期 - 比如这样: <start>2002-09-24Z</start>
参考资料:
// 给你一个例子,你参考下
// java通过dom读写xml文件
/要读的xml文件
<xml version="10" encoding="GB2312">
<学生花名册>
<学生 性别 = "男">
<姓名>李华</姓名>
<年龄>14</年龄>
</学生>
<学生 性别 = "男">
<姓名>张三</姓名>
<年龄>16</年龄>
</学生>
</学生花名册>
/
package xml;
import javaioFileOutputStream;
import javaioOutputStreamWriter;
import javaioWriter;
import javautilIterator;
import javautilVector;
import javaxxmlparsersDocumentBuilder;
import javaxxmlparsersDocumentBuilderFactory;
import javaxxmltransformOutputKeys;
import javaxxmltransformResult;
import javaxxmltransformSource;
import javaxxmltransformTransformer;
import javaxxmltransformTransformerConfigurationException;
import javaxxmltransformTransformerException;
import javaxxmltransformTransformerFactory;
import javaxxmltransformdomDOMSource;
import javaxxmltransformstreamStreamResult;
import orgw3cdomDocument;
import orgw3cdomElement;
import orgw3cdomNode;
import orgw3cdomNodeList;
import orgw3cdomText;
public class DomTest {
Vector students_Vector;
private Vector readXMLFile(String file) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactorynewInstance();
DocumentBuilder builder = dbfnewDocumentBuilder();
Document doc = builderparse(file); // 获取到xml文件
// 下面开始读取
Element root = docgetDocumentElement(); // 获取根元素
NodeList students = rootgetElementsByTagName_r("学生");
students_Vector = new Vector();
for (int i = 0; i < studentsgetLength(); i++) {
// 一次取得每一个学生元素
Element ss = (Element) studentsitem(i);
// 创建一个学生的实例
student stu = new student();
stusetSex(ssgetAttribute("性别"));
NodeList names = ssgetElementsByTagName_r("姓名");
Element e = (Element) namesitem(0);
Node t = egetFirstChild();
stusetName(tgetNodeValue());
NodeList ages = ssgetElementsByTagName_r("年龄");
e = (Element) agesitem(0);
t = egetFirstChild();
stusetAge(IntegerparseInt(tgetNodeValue()));
students_Vectoradd(stu);
}
return students_Vector;
}
// 写入xml文件
public static void callWriteXmlFile(Document doc, Writer w, String encoding) {
try {
Source source = new DOMSource(doc);
Result result = new StreamResult(w);
Transformer xformer = TransformerFactorynewInstance()
newTransformer();
xformersetOutputProperty(OutputKeysENCODING, encoding);
xformertransform(source, result);
} catch (TransformerConfigurationException e) {
eprintStackTrace();
} catch (TransformerException e) {
eprintStackTrace();
}
}
private void writeXMLFile(String outfile) {
DocumentBuilderFactory dbf = DocumentBuilderFactorynewInstance();
DocumentBuilder builder = null;
try {
builder = dbfnewDocumentBuilder();
} catch (Exception e) {
}
Document doc = buildernewDocument();
Element root = doccreateElement("学生花名册");
docappendChild(root); // 将根元素添加到文档上
// 获取学生信息
for (int i = 0; i < students_Vectorsize(); i++) {
student s = (student) students_Vectorget(i);
// 创建一个学生
Element stu = doccreateElement("学生");
stusetAttribute("性别", sgetSex());
rootappendChild(stu);// 添加属性
// 创建文本姓名节点
Element name = doccreateElement("姓名");
stuappendChild(name);
Text tname = doccreateTextNode(sgetName());
nameappendChild(tname);
//创建文本年龄节点
Element age = doccreateElement("年龄");
stuappendChild(age); // 将age添加到学生节点上
Text tage = doccreateTextNode(StringvalueOf(sgetAge()));
ageappendChild(tage); // 将文本节点放在age节点上
}
try {
FileOutputStream fos = new FileOutputStream(outfile);
OutputStreamWriter outwriter = new OutputStreamWriter(fos);
// ((XmlDocument)doc)write(outwriter); //出错!
callWriteXmlFile(doc, outwriter, "gb2312");
outwriterclose();
fosclose();
} catch (Exception e) {
eprintStackTrace();
}
}
public static void main(String args[]) {
String str = "xml/studentxml";
DomTest t = new DomTest();
try {
Vector v = treadXMLFile(str);
Iterator it = viterator();
while (ithasNext()) {
student s = (student) itnext();
Systemoutprintln(sgetName() + "\t" + sgetAge() + "\t"
+ sgetSex());
}
} catch (Exception e) {
eprintStackTrace();
}
String outfile = "xml/stucopyxml";
twriteXMLFile(outfile);
}
}
class student{
private String sex;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
public void setSex(String s){sex=s;}
public String getSex(){return sex;}
public void setName(String n){name=n;}
public String getName(){return name;}
}
你首先要明白,xml是从根节点以下来读取数据的,所以除了根节点不用写外,其它一定要按照树状结构来写,因为所有的数据都是以数组的形式返回的,所以应该以数组的方式调用。因为在这里我分不出你的结构,所以真不好告诉你。
Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件。> 2: 3: 4: 5:数据结构 6:严蔚敏 7:3000 8: 9: 10:路由型与交换型互联网基础 11:程庆梅 12:2700 13: 14: 15:计算机硬件技术基础 16:李继灿 17:2500 18: 19: 20:软件质量保证与管理 21:朱少民 22:3900 23: 24: 25:算法设计与分析 26:王红梅 27:2300 28: 29: 30:计算机 *** 作系统 31:7-111-19149-1 32:28 33: 34:为了方便读取,我还定义一个书的实体类,名为BookModel,具体内容如下: 1:using System; 2:using SystemCollectionsGeneric; 3:using SystemLinq; 4:using SystemText; 5: 6:namespace 使用XmlDocument 7: { 8:publicclass BookModel 9: { 10:public BookModel() 11: { } 12:/// 13:/// 所对应的课程类型 14:/// 15:privatestring bookType; 16: 17:publicstring BookType 18: { 19: get { return bookType; } 20: set { bookType = value; } 21: } 22: 23:/// 24:/// 书所对应的ISBN号 25:/// 26:privatestring bookISBN; 27: 28:publicstring BookISBN 29: { 30: get { return bookISBN; } 31: set { bookISBN = value; } 32: } 33: 34:/// 35:/// 书名 36:/// 37:privatestring bookName; 38: 39:publicstring BookName 40: { 41: get { return bookName; } 42: set { bookName = value; } 43: } 44: 45:/// 46:/// 作者 47:/// 48:privatestring bookAuthor; 49: 50:publicstring BookAuthor 51: { 52: get { return bookAuthor; } 53: set { bookAuthor = value; } 54: } 55: 56:/// 57:/// 价格 58:/// 59:privatedouble bookPrice; 60: 61:publicdouble BookPrice 62: { 63: get { return bookPrice; } 64: set { bookPrice = value; } 65: } 66: } 67: }1使用XmlDocument使用XmlDocument是一种基于文档结构模型的方式来读取XML文件在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树最开始的一个结点叫作根结点,每个结点都可以有自己的子结点得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性例如: 1: xn 代表一个结点 2: xnName;//这个结点的名称 3: xnValue;//这个结点的值 4: xnChildNodes;//这个结点的所有子结点 5: xnParentNode;//这个结点的父结点 6: 11 读取所有的数据使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件 1: XmlDocument doc = new XmlDocument(); 2: docLoad(@"\\Bookxml");然后可以通过调用SelectSingleNode得到指定的结点,通过GetAttribute得到具体的属性值参看下面的代码 1:// 得到根节点bookstore 2: XmlNode xn = xmlDocSelectSingleNode("bookstore"); 3: 4: 5:// 得到根节点的所有子节点 6: XmlNodeList xnl = xnChildNodes; 7: 8:foreach (XmlNode xn1 in xnl) 9: { 10: BookModel bookModel = new BookModel(); 11:// 将节点转换为元素,便于得到节点的属性值 12: XmlElement xe = (XmlElement)xn1; 13:// 得到Type和ISBN两个属性的属性值 14: bookModelBookISBN = xeGetAttribute("ISBN")ToString(); 15: bookModelBookType = xeGetAttribute("Type")ToString(); 16:// 得到Book节点的所有子节点 17: XmlNodeList xnl0 = xeChildNodes; 18: bookModelBookName=xnl0Item(0)InnerText; 19: bookModelBookAuthor=xnl0Item(1)InnerText; 20: bookModelBookPrice=ConvertToDouble(xnl0Item(2)InnerText); 21: bookModeListAdd(bookModel); 22: } 23: dgvBookInfoDataSource = bookModeList;在正常情况下,上面的代码好像没有什么问题,但是对于读取上面的XML文件,则会出错,原因就是因为我上面的XML文件里面有注释,大家可以参看Bookxml文件中的第三行,我随便加的一句注释注释也是一种结点类型,在没有特别说明的情况下,会默认它也是一个结点(Node)所以在把结点转换成元素的时候就会报错"无法将类型为“SystemXmlXmlComment”的对象强制转换为类型“SystemXmlXmlElement”。"幸亏它里面自带了解决办法,那就是在读取的时候,告诉编译器让它忽略掉里面的注释信息修改如下: 1: XmlDocument xmlDoc = new XmlDocument(); 2: XmlReaderSettings settings = new XmlReaderSettings(); 3: settingsIgnoreComments = true;//忽略文档里面的注释 4: XmlReader reader = XmlReaderCreate(@"\\Bookxml", settings); 5: xmlDocLoad(reader);最后读取完毕后,记得要关掉reader 1: readerClose();这样它就不会出现错误最后运行结果如下:12 增加一本书的信息向文件中添加新的数据的时候,首先也是通过XmlDocument加载整个文档,然后通过调用SelectSingleNode方法获得根结点,通过CreateElement方法创建元素,用CreateAttribute创建属性,用AppendChild把当前结点挂接在其它结点上,用SetAttributeNode设置结点的属性具体代码如下:加载文件并选出要结点: 1: XmlDocument doc = new XmlDocument(); 2: docLoad(@"\\Bookxml"); 3: XmlNode root = docSelectSingleNode("bookstore");创建一个结点,并设置结点的属性: 1: XmlElement xelKey = docCreateElement("book"); 2: XmlAttribute xelType = docCreateAttribute("Type"); 3: xelTypeInnerText = "adfdsf"; 4: xelKeySetAttributeNode(xelType);创建子结点: 1: XmlElement xelAuthor = docCreateElement("author"); 2: xelAuthorInnerText = "dfdsa"; 3: xelKeyAppendChild(xelAuthor);最后把book结点挂接在要结点上,并保存整个文件: 1: rootAppendChild(xelKey); 2: docSave(@"\\Bookxml");用上面的方法,是向已有的文件上追加数据,如果想覆盖原有的所有数据,可以更改一下,使用LoadXml方法: 1: XmlDocument doc = new XmlDocument(); 2: docLoadXml("");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据直接把根结点选择出来了,后面不用SelectSingleNode方法选择根结点,直接创建结点即可,代码同上13 删除某一个数据想要删除某一个结点,直接找到其父结点,然后调用RemoveChild方法即可,现在关键的问题是如何找到这个结点,上面的SelectSingleNode可以传入一个Xpath表,我们通过书的ISBN号来找到这本书所在的结点如下: 1: XmlElement xe = xmlDocDocumentElement; // DocumentElement 获取xml文档对象的根XmlElement 2:string strPath = stringFormat("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfoCurrentRowCells[1]ValueToString()); 3: XmlElement selectXe = (XmlElement)xeSelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点 4: selectXeParentNodeRemoveChild(selectXe);"/bookstore/book[@ISBN=\"{0}\"]"是一个Xpath表达式,找到ISBN号为所选那一行ISBN号的那本书,有关Xpath的知识请参考:XPath 语法14 修改某要条数据修改某 条数据的话,首先也是用Xpath表达式找到所需要修改的那一个结点,然后如果是元素的话,就直接对这个元素赋值,如果是属性的话,就用SetAttribute方法设置即可如下: 1: XmlElement xe = xmlDocDocumentElement; // DocumentElement 获取xml文档对象的根XmlElement 2:string strPath = stringFormat("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfoCurrentRowCells[1]ValueToString()); 3: XmlElement selectXe = (XmlElement)xeSelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点 4: selectXeSetAttribute("Type", dgvBookInfoCurrentRowCells[0]ValueToString());//也可以通过SetAttribute来增加一个属性 5: selectXeGetElementsByTagName("title")Item(0)InnerText = dgvBookInfoCurrentRowCells[2]ValueToString(); 6: selectXeGetElementsByTagName("author")Item(0)InnerText = dgvBookInfoCurrentRowCells[3]ValueToString(); 7: selectXeGetElementsByTagName("price")Item(0)InnerText = dgvBookInfoCurrentRowCells[4]ValueToString(); 8: xmlDocSave(@"\\Bookxml");2使用XmlTextReader和XmlTextWriterXmlTextReader和XmlTextWriter是以流的形式来读写XML文件21XmlTextReader使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的 *** 作如下: 1: XmlTextReader reader = new XmlTextReader(@"\\Bookxml"); 2: List modelList = new List(); 3: BookModel model = new BookModel(); 4:while (readerRead()) 5: { 6: 7:if (readerNodeType == XmlNodeTypeElement) 8: { 9:if (readerName == "book") 10: { 11: modelBookType = readerGetAttribute(0); 12: modelBookISBN = readerGetAttribute(1); 13: } 14:if (readerName == "title") 15: { 16: modelBookName=readerReadElementString()Trim(); 17: } 18:if (readerName == "author") 19: { 20: modelBookAuthor = readerReadElementString()Trim(); 21: } 22:if (readerName == "price") 23: { 24: modelBookPrice = ConvertToDouble(readerReadElementString()Trim()); 25: } 26: } 27: 28:if (readerNodeType == XmlNodeTypeEndElement) 29: { 30: modelListAdd(model); 31: model = new BookModel(); 32: } 33: 34: 35: } 36: modelListRemoveAt(modelListCount-1); 37:thisdgvBookInfoDataSource = modelList;关键是读取属性的时候,你要先知道哪一个结点具有几个属性,然后通过GetAttribute方法来读取读取属性还可以用另外一种方法,就是用MoveToAttribute方法可参见下面的代码: 1:if (readerName == "book") 2: { 3:for (int i = 0; i < readerAttributeCount; i++) 4: { 5: readerMoveToAttribute(i); 6:string str = "属性:" + readerName + "=" + readerValue; 7: } 8: modelBookType = readerGetAttribute(0); 9: modelBookISBN = readerGetAttribute(1); 10: }效果如下:22XmlTextWriterXmlTextWriter写文件的时候,默认是覆盖以前的文件,如果此文件名不存在,它将创建此文件首先设置一下,你要创建的XML文件格式, 1: XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"\\Book1xml", null); 2://使用 Formatting 属性指定希望将 XML 设定为何种格式。
以上就是关于XML配置文件怎么写,都有些什么属性java代码如何解析XML配置文件全部的内容,包括:XML配置文件怎么写,都有些什么属性java代码如何解析XML配置文件、如何用Java实现对xml文件的读取和写入以及保存、python 如何从XML格式的文件中获取内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)