Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SAX解析方法charecters()是如何工作的_Java_Xml_Methods_Character_Saxparser - Fatal编程技术网

Java SAX解析方法charecters()是如何工作的

Java SAX解析方法charecters()是如何工作的,java,xml,methods,character,saxparser,Java,Xml,Methods,Character,Saxparser,我试图从xml文件中读取数据,并使用SAX解析方法将其存储在列表中。我的问题是当我试图使用characters()方法存储数据值时。我正在创建一个对象,其中为每个元素存储每个值和一些额外的信息,以供以后使用,但当我尝试存储所述值时,它会存储空格。我尝试在方法内部打印,虽然它需要遍历所有xml文件,但它只打印了几个元素,甚至没有按正确的顺序打印。有人能解释一下我错过了什么吗 XML文件: <?xml version="1.0" encoding="UTF-8"?> <CarMod

我试图从xml文件中读取数据,并使用SAX解析方法将其存储在列表中。我的问题是当我试图使用
characters()
方法存储数据值时。我正在创建一个对象,其中为每个元素存储每个值和一些额外的信息,以供以后使用,但当我尝试存储所述值时,它会存储空格。我尝试在方法内部打印,虽然它需要遍历所有xml文件,但它只打印了几个元素,甚至没有按正确的顺序打印。有人能解释一下我错过了什么吗

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<CarModel>
<Audi model = "TT" year = "2006" starting_price = "33.000$">
<type>sport</type>
<horse_power>222hp</horse_power>
<drivetrain>quattro</drivetrain
<transmission>6_Manual</transmission>
</Audi>
<Mercedes model = "W222_S400" year = "2013" starting_price = 
63.000$">
<type>luxury</type>
<horse_power>302hp</horse_power>
<drivetrain>front_wheel_drive</drivetrain>
<transmission>7_Automatic</transmission>
</Mercedes>
</CarModel>

运动
222hp

quattrocharacters
方法仅打印元素内部的文本(无属性),但也包括文档中可能存在的所有空格、制表符和换行符,它们是根元素的后代

如果要读取特定元素中的文本,则应在输入该元素时设置一个标志(在
startElement()
中),然后在
endElement()
中取消设置该标志,并在
characters()
中测试当前是否位于要从中提取文本的元素中

private boolean inTypeTag = false;

public void startElement(String uri, String localName, String qName, ...) ...{
    if (qName.equals("type") {
        inTypeTag = true;
    }
    ...
}

public void endElement(String uri, String localName, String qName, ...)  ...{
    if (qName.equals("type") {
        inTypeTag = false;
    }
    ...
}

public void characters(char ch[], int start, int length) ... {
    if (inTypeTag) {
        // do something with the text ("sport") which was found in here
    }
    ...
}

谢谢这个布尔变量的方法是否可以以某种方式修改,这样我就可以保留和存储我可能拥有的任何属性,因为我看到它们也被null覆盖了。。。我看到一篇帖子建议使用Map,但我是java新手,看起来有点复杂……是的。如果必须跟踪许多元素,可以使用贴图或数组。您也可以考虑为XML结构创建类层次结构。当然,如果你必须映射整个文档,你可以考虑使用一个自动完成的API,比如DOM,甚至JAXB也可以生成这些类。当您必须按顺序读取文档并提取选定数据时,SAX是一个很好的选择。您可能还需要考虑StAX,它也是java SE的一部分,位于SAX和DOM之间。
private boolean inTypeTag = false;

public void startElement(String uri, String localName, String qName, ...) ...{
    if (qName.equals("type") {
        inTypeTag = true;
    }
    ...
}

public void endElement(String uri, String localName, String qName, ...)  ...{
    if (qName.equals("type") {
        inTypeTag = false;
    }
    ...
}

public void characters(char ch[], int start, int length) ... {
    if (inTypeTag) {
        // do something with the text ("sport") which was found in here
    }
    ...
}