gpt4 book ai didi

java - 使用 SAX 字符方法从 XML 元素解析 PCDATA

转载 作者:行者123 更新时间:2023-12-02 04:49:57 25 4
gpt4 key购买 nike

我正在使用 SAX API 来解析 xml 文档,但很难从 XML 中的每个位置存储元素 PCDATA。

Oracle 文档 SAX API显示字符()用于从元素解析 PCDATA,但我不确定应该如何调用它。

在我当前的实现中, boolean 标志用于在遇到 XML 文档中的某个元素时发出信号。当遇到元素时,这些标志将在 startElement() 中触发。

我在 charaters() 中的 boolean 变量 description 上设置了断点,但 boolean 值直到 startElement() 才设置为 true被调用,意味着 PCDATA 永远不会被解析。

我的问题是在 startElement() 中设置 boolean 值后如何调用characters()?

这是在 charaters() 之后调用的 startElement():

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (qName.equals("location")){
location = true;

System.out.println("Found a location...");
try {
//Read in the values for the attributes of the element <location>
int locationID = Integer.parseInt(atts.getValue("id"));
String locationName = atts.getValue("name");


//Generate a new instance of Location on-the-fly using reflection. The statement Class.forName("gmit.Location").newInstance(); invokes the
//Java Class Loader and the calls the null (default) constructor of Location.
Location loc = (Location) Class.forName("gmit.Location").newInstance();
loc.setId(locationID); //Now configure the Location object with an ID, Name, Description etc...
loc.setName(locationName);
loc.setDescription(locationDescription);


} catch (Exception e) {
e.printStackTrace();
}

}else if (qName.equals("description")){
description = true;
//need to invoke the charaters method here after the description
//flag is set to true
System.out.println("Found a description. You should tie this to the last location you encountered...");

}

charaters()会在程序启动时立即调用,但需要在上述方法中设置 boolean 标志后调用:

public void characters(char[] ch,int start, int length) throws SAXException{
if (location){

}else if (description){

locationDescription = new String( ch, start, length);
System.out.println("Description = " + locationDescription);

}

XML 文件中的位置之一的示例:

<location id="1" name="Tiberius">
<description>
You are in the city of Tiberius. You see a long street with high buildings and a castle.You see an exit to the south.
</description>
<exit title="Desert" direction="S"/>
</location>

最佳答案

how can I call the characters() after the boolean values are set in startElement() ?

你不能。 SAX 解析的重点是解析器调用您的处理程序,而不是您调用解析器。

每次 SAX 解析器在文档中遇到字符数据时,都会调用您的 characters 方法。您的处理程序将需要确定此数据是否相关(是位置、描述还是可以忽略的内容?),如果相关,则将此数据存储在以后可以检索的地方。

您已经向我们展示了您正在使用的 startElement 方法。如果您还没有这样做,您还需要重写 endElement。您需要在 endElement 方法中将 boolean 值 locationdescription 设置为 false,以便您的 SAX 处理程序知道它不再位于适当的 locationdescription 元素内。

您还没有向我们展示示例 XML 文档。也许你有这样的事情:

 <widgetList>
<widget>
<name>First widget</name>
<location>Over there</location>
<description>This is the first widget in the list</description>
</widget>
<widget>
<name>Second widget</name>
<location>Very far away</location>
<description>This is the second widget in the list</description>
</widget>
</widgetList>

如果是这样,您可能还想处理 widget 元素的结尾。例如,这可以获取处理程序遇到的最后一个位置和描述,将它们放在一个 Widget 对象中,并将其存储在处理程序内的某个列表中。在解析结束时,您可以从处理程序中读取小部件列表。

关于java - 使用 SAX 字符方法从 XML 元素解析 PCDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29323687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com