使用SAX处理XML的Java
我需要用给定的结构解析XML:使用SAX处理XML的Java,java,android,xml,sax,Java,Android,Xml,Sax,我需要用给定的结构解析XML: <?xml version="1.0" encoding="UTF-8"?> <root> <tag label="idAd"> <child label="text">Text</child> </tag> <tag label="idNumPage"> <child label1="text" label2="text">Text<
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag label="idAd">
<child label="text">Text</child>
</tag>
<tag label="idNumPage">
<child label1="text" label2="text">Text</child>
</tag>
</root>
我想读取第二个“标记”元素属性(
label1
和label2
),但我的StartElementListener读取第一个标记,因为它们具有相同的结构和属性(那些label=“idAd”
和label=“idNumPage”
)区分它们。我如何告诉StartElementListener只处理第二个
元素?如果您坚持使用StartElementListener
-方式,您应该将侦听器设置为标记元素,当标签
等于“idNumPage”时,设置一个标志,因此,应该读取在子元素上设置的另一个StartElementListener
更新
下面是如何使用这些侦听器执行此操作的示例:
android.sax.Element tag = root.getChild("tag");
final StartTagElementListener listener = new StartTagElementListener();
tag.setStartElementListener(listener);
android.sax.Element page_info = tag.getChild("child");
page_info.setStartElementListener(new StartElementListener()
{
@Override
public void start(Attributes attributes)
{
if (listener.readNow())
{
//TODO: you are in the tag with label="idNumPage"
}
}
});
而StartTagElementListener
是通过一个额外的readNow
getter实现的,让我们知道何时读取子标签的属性:
public final class StartTagElementListener implements StartElementListener
{
private boolean doReadNow = false;
@Override
public void start(Attributes attributes)
{
doReadNow = attributes.getValue("label").equals("idNumPage");
}
public boolean readNow()
{
return doReadNow;
}
}
<强> ps < /强>:您是否考虑使用<代码> org?xx.xx.Helps.Debug thordLoad 实现此任务? 如果您坚持使用
StartElementListener
方式,则应将侦听器设置为标记
元素,当标签
等于“idNumPage”时,设置一个标志,以便读取您在子元素
上设置的另一个StartElementListener
更新
下面是如何使用这些侦听器执行此操作的示例:
android.sax.Element tag = root.getChild("tag");
final StartTagElementListener listener = new StartTagElementListener();
tag.setStartElementListener(listener);
android.sax.Element page_info = tag.getChild("child");
page_info.setStartElementListener(new StartElementListener()
{
@Override
public void start(Attributes attributes)
{
if (listener.readNow())
{
//TODO: you are in the tag with label="idNumPage"
}
}
});
而StartTagElementListener
是通过一个额外的readNow
getter实现的,让我们知道何时读取子标签的属性:
public final class StartTagElementListener implements StartElementListener
{
private boolean doReadNow = false;
@Override
public void start(Attributes attributes)
{
doReadNow = attributes.getValue("label").equals("idNumPage");
}
public boolean readNow()
{
return doReadNow;
}
}
<强> ps < /强>:您是否考虑使用<代码> org?xx.xx.Helps.Debug thordLoad 实现此任务? 需要明确的是:您使用的不是SAX,而是SAX之上的一些特定于android的类。我之所以提到这一点,是因为任何了解SAX但不了解android的人(像我一样)都会被你的问题弄糊涂。我想说,你的起步是错误的,如果你在android上使用XML,那么你真的应该使用简单的XML()。我有一篇博客文章解释了如何将其整合到您的项目中:只是要明确一点:您使用的不是SAX,而是SAX之上的一些特定于android的类。我之所以提到这一点,是因为任何了解SAX但不了解android的人(像我一样)都会被你的问题弄糊涂。我想说,你的起步是错误的,如果你在android上使用XML,那么你真的应该使用简单的XML()。我有一篇博客文章解释了如何合并到您的项目中:现在我使用匿名内部类作为每个标记的侦听器,我认为这是无效的,所以我考虑使用DefaultHandler。(匿名)内部类没有问题,但在这种情况下,
DefaultHandler
实现是更好的选择,我很高兴你成功了!现在我使用匿名内部类作为每个标记的侦听器,我认为这是无效的,因此我考虑使用DefaultHandler。内部类(匿名)没有问题,但在本例中,DefaultHandler
实现是更好的选择,我很高兴您选择了它!