使用SAX处理XML的Java

使用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:

<?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
实现是更好的选择,我很高兴您选择了它!