package huawei;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
<Document>
<Head/>
<Head>I am head.</Head1>
<Body>I am body.<></Body>
<Body1>I am body.<Body1>
<Body2>I am body.
<Body3 A="A" A="B">I am body.</Body3>
<Nobody><Nobody/>
</Document
*/
/**
* 请注意不要修改包名、类名,否则将导致考试成绩失效
*/
public class JavaTest {
/**
* 该函数解析XML文件,并判断Xml结构是否有异常。
*
* @param filePath
* Xml源文件
*
* @return 0 Xml文件结构正常 >0 Xml结构异常,返回值为结构异常的行号(第一行错误,返回值为1)
*/
public int parseXml(String filePath) {
// !!!由于阅卷时会单独执行本函数,因此确保函数能独立读文件,读文件操作不要放到函数外!!!
// 读文件示例如下,可以自行修改
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(filePath));
// TODO: Please add your code here!
List<Integer> every_rows = new ArrayList<Integer>();
int totalRowsNum = 0;
String line = br.readLine();
String string = "";
while (line != null) {
// process the line
every_rows.add(line.trim().length());
string += line.trim();
// read next line
line = br.readLine();
}
List<String> ary_lists = new ArrayList<String>();
for (int i = 0; i < string.length(); i++) {
if (string.charAt(i) == '<') {
for (int j = i + 1; j < string.length(); j++) {
if (string.charAt(j) == '>') {
if (j == i + 1) {
for (int h = 0; h < every_rows.size(); h++) {
totalRowsNum += every_rows.get(h);
if (i < totalRowsNum) {
return h + 1;
}
}
}
ary_lists.add(string.substring(i, j + 1));
for (int z = j + 1; z < string.length(); z++) {
if (string.charAt(z) == '<') {
String str = string.substring(j + 1, z);
if (str.length() != 0) {
Integer str1 = str.length();
ary_lists.add(str1.toString());
}
break;
}
}
break;
} else if (j == string.length() - 1
&& string.charAt(j) != '>') {
for (int h = 0; h < every_rows.size(); h++) {
totalRowsNum += every_rows.get(h);
if (j + 1 <= totalRowsNum) {
return h + 1;
}
}
}
}
}
}
List<String> pro_lists = new ArrayList<String>();
int space_GPS = 0;
for (int i = 0; i < ary_lists.size(); i++) {
for (int j = 0; j < ary_lists.get(i).length(); j++) {
if (ary_lists.get(i).charAt(j) == ' ') {
space_GPS = j;
pro_lists.add(ary_lists.get(i).substring(space_GPS,
ary_lists.get(i).length() - 1));
break;
}
}
}
for (int i = 0; i < pro_lists.size(); i++) {
String[] str_pronum = {};
String string2 = pro_lists.get(i);
if (string2.contains(",")) {
String stringarray1[] = string2.split("=");
str_pronum = Arrays.copyOf(str_pronum,
str_pronum.length + 1);
str_pronum[str_pronum.length - 1] = stringarray1[0];
for (int j = 1; j < stringarray1.length - 1; j++) {
String stringarray2[] = stringarray1[j].split(",");
for (int z = 0; z < stringarray2.length; z++) {
if ((z + 1) % 2 == 0) {
str_pronum = Arrays.copyOf(str_pronum,
str_pronum.length + 1);
str_pronum[str_pronum.length - 1] = stringarray2[z];
}
}
}
} else {
String stringarray1[] = string2.split("=");
str_pronum = Arrays.copyOf(str_pronum,
str_pronum.length + 1);
str_pronum[str_pronum.length - 1] = stringarray1[0];
for (int j = 1; j < stringarray1.length - 1; j++) {
String stringarray2[] = stringarray1[j].split(" ");
for (int z = 0; z < stringarray2.length; z++) {
if ((z + 1) % 2 == 0) {
str_pronum = Arrays.copyOf(str_pronum,
str_pronum.length + 1);
str_pronum[str_pronum.length - 1] = stringarray2[z];
}
}
}
}
int errornum = 0;
for (int j = 0; j < str_pronum.length; j++) {
if (str_pronum.length != 1) {
for (int z = 0; z < str_pronum.length - 1 - z; z++) {
if (str_pronum[z].trim().equals(
str_pronum[z + 1].trim())) {
for (int n = 0; n < ary_lists.size(); n++) {
if (ary_lists.get(n).contains(
pro_lists.get(i))) {
for (int m = 0; m < n; m++) {
errornum += ary_lists.get(m)
.length();
}
for (int h = 0; h < every_rows.size(); h++) {
totalRowsNum += every_rows.get(h);
if (errornum < totalRowsNum) {
return h + 2;
}
}
}
}
}
}
}
}
}
List<String> ary_lists1 = new ArrayList<String>();
int count;
for (int i = 0; i < ary_lists.size(); i++) {
count = 0;
for (int j = 0; j < ary_lists.get(i).length(); j++) {
if (ary_lists.get(i).charAt(j) == ' ') {
ary_lists1.add(ary_lists.get(i).substring(0, j) + ">");
count = 1;
break;
}
}
if (count == 0) {
ary_lists1.add(ary_lists.get(i));
}
}
int total_num = 0;
boolean[] panduan = new boolean[ary_lists1.size()];
for (int i = 0; i < ary_lists1.size(); i++) {
if (panduan[i] == false) {
if (ary_lists1.get(i).contains("<")) {
for (int j = i + 1; j < ary_lists1.size(); j++) {
if (!ary_lists1.get(j).contains("<")) {
panduan[j] = true;
}
if (panduan[j] == false) {
if (ary_lists1
.get(j)
.substring(1,
ary_lists1.get(j).length() - 1)
.contains("/")) {
if (("/" + ary_lists1.get(i).subSequence(1,
ary_lists1.get(i).length() - 1))
.equals(ary_lists1
.get(j)
.substring(
1,
ary_lists1.get(j)
.length() - 1))) {
panduan[i] = true;
panduan[j] = true;
break;
}
}
}
}
} else {
return 1;
}
}
}
for (int i = 0; i < ary_lists1.size(); i++) {
if (panduan[i] == true) {
if (ary_lists.get(i).contains("<")) {
total_num += ary_lists.get(i).length();
} else {
total_num += Integer.parseInt(ary_lists.get(i));
}
} else {
for (int h = 0; h < every_rows.size(); h++) {
totalRowsNum += every_rows.get(h);
if (total_num + 1 < totalRowsNum) {
return h + 1;
}
}
}
}
} catch (Exception e) {
System.out.println("open file execption : " + e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
System.out.println("close file execption : " + e);
}
}
}
return 0;
}
public static void main(String[] args) {
JavaTest c = new JavaTest();
int result = c.parseXml("g.xml");
if (result == 0) {
System.out.println("Xml file OK.");
} else {
System.out.println("Xml file error at line: " + result);
}
}
}
分享到:
相关推荐
XML文件到XSD文件的转化: 1. **理解XSD元素**:XSD文件主要由元素、属性、数据类型和约束规则组成,用于定义XML文档的结构和约束。例如,你可以定义元素的名称、是否为必需、允许的值范围等。 2. **创建XSD模板**:...
它可以包含元素定义、属性定义以及元素间的关系,确保XML文档的合法性。DTD可以内嵌在XML文档中,也可以作为外部文件引用。 DOM解析是Java中常用的一种解析XML的方式。在DOM解析中,`Document`对象代表整个XML文档...
下面是使用Java DOM解析器进行XML文件合法性和非法性验证的详细步骤和相关知识点: 1. **XML解析器**: 首先,你需要一个XML解析器,如Java的标准库中提供的`javax.xml.parsers.DocumentBuilderFactory`。这个工厂类...
- **Ajax请求**:通过XMLHttpRequest或fetch API,可以获取XML文件并自动进行解码,然后使用DOMParser解析响应数据。 6. **XML与JSON的比较** - 虽然XML在早期Web开发中广泛使用,但现在JSON(JavaScript Object ...
- DTD(Document Type Definition)和XML Schema:它们用于定义XML文档的结构和数据类型,确保数据的合法性。 - XPath:一种语言,用于选取XML文档中的节点。XPath表达式可以定位元素、属性,甚至计算节点集。 - ...
通过使用W3C提供的XML校验工具,开发者可以轻松地确保XML文档的合法性和一致性,从而提高数据处理的可靠性和效率。无论是对于个人开发者还是企业级项目,掌握如何有效地利用这些工具都是非常重要的。
通过XMLTest实例,我们可以学习如何在Java或其他编程语言中实现这些功能,包括如何读取XML文件、解析XML元素、处理属性、以及如何在实际应用中使用解析的数据。理解XML解析不仅有助于开发人员处理和存储数据,还能为...
- DTD(Document Type Definition)和XML Schema:为XML文档提供结构约束,确保文档的合法性。 2. **C++解析XML的方法** - DOM(Document Object Model):将整个XML文档加载到内存中,形成一个节点树,便于遍历...
这一步骤确保了XML文档的合法性。 4. **验证XML文件**:使用XSD文件对XML文件进行验证,确保XML符合XSD定义的规则。可以使用XML解析器或者命令行工具如`xmllint`来进行验证。 5. **生成Java类**:利用JAXB或其他...
- 验证XML:检查XML文档是否符合指定的DTD(Document Type Definition)或XML Schema,确保其结构合法性。 - 查找和修改元素:根据节点路径(XPath)查找特定元素,或者直接修改元素的属性和内容。 - 事件监听:如果...
* DOM 方式可以验证 XML 文档的合法性 DOM 的缺点 * DOM 方式需要将整个 XML 文档加载到内存中,占用大量内存 * DOM 方式解析大型 XML 文档时速度较慢 SAX 方式 SAX(Simple API for XML)是一种基于事件的解析...
3. DTD(Document Type Definition)或XML Schema:用于定义XML文档的结构和约束,确保数据的合法性。DTD是XML 1.0时代的规范,而XML Schema则是更现代、功能更强大的验证工具。 4. DOM(Document Object Model):...
- DTD(Document Type Definition)或XSD(XML Schema Definition):定义XML文档的结构和数据类型,用于验证XML文档的合法性。 2. **DOM4J库**: - DOM4J是基于Java的DOM模型,提供了一种简单而强大的接口来处理...
5. **支持XML Schema**: Castor能够基于XML Schema进行对象绑定,保证了数据的合法性。 6. **性能优化**:Castor使用高效的缓存机制,对于重复解析的XML节点,能有效避免不必要的内存开销。 7. **灵活的映射策略*...
XML还支持DTD(Document Type Definition)和XSD(XML Schema Definition)来定义文档结构和约束,确保XML数据的合法性。这些验证机制可以在解析时使用,确保程序接收到的数据符合预期。 此外,XPath是XML的一个...
- 掌握XML文档类型定义(DTD)或XML Schema(XSD),用于验证XML文件的结构合法性。 - 熟悉XPath和XSLT,XPath用于在XML文档中查找节点,XSLT用于转换XML结构。 - 实践编程,通过编写读写XML文件的代码加深理解。 ...
9. **调试与测试**:验证XML文件是否正确时,通常需要编写测试用例,包括合法的XML文档和预期会失败的非法XML,以确保验证逻辑的准确性。 综上所述,"通过Schema验证XML文件格式是否正确"这个主题涵盖的内容广泛,...
在VC++环境中,验证XML文件的正确性是一个重要的任务,特别是在处理XML数据的读取、解析和存储时。XML(eXtensible Markup Language)是一种结构化数据格式,广泛用于数据交换和配置文件。为了确保XML文件符合预期的...
解析器负责读取XML文件,检查其语法合法性,并将XML文档转换为内存中的数据结构,如节点树。 2. **XML节点树**:解析XML后,数据以节点树的形式存在,包括元素节点、文本节点、属性节点等。开发者可以通过遍历和...
确保正确处理XML解析错误,同时在应用更改前验证XML文件格式的合法性。此外,为了提供更好的用户体验,可以添加事件监听器,以便在XML文件更改时实时更新DataGrid。 总之,通过将列的定义从代码中分离出来并存储在...