【问题标题】:How does SAX parsing method charecters() workSAX 解析方法 charecters() 是如何工作的
【发布时间】:2014-06-07 22:50:37
【问题描述】:

我正在尝试从 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>

JAVA 代码:

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

      lvl_cnt++;
      System.out.println(lvl_cnt);
      obj = new xml_obj();
      obj.setLvl(lvl_cnt);
 System.out.println("LVL "+obj.getLvl());
      if (lvl_cnt == 0) {
         obj.setValue(qName);
         obj.setParent("root");
         System.out.println(obj.getParent());
      }
      else {
        xml_obj tmp =  objListofLists.get(objListofLists.size()-1);
        int lvl_before = tmp.getLvl();
        System.out.println("AAA" + lvl_before);
        if (lvl_cnt > lvl_before) {
           obj.setParent(tmp.getValue());
        }
        else if (lvl_cnt < lvl_before) {
            int j = 0;
            while (objListofLists.get(j).getLvl() != lvl_cnt) j++;
            tmp = objListofLists.get(j);
            obj.setParent(tmp.getParent());
        }
        else {
           obj.setParent(tmp.getParent());
        }
            System.out.println(obj.getParent());
      }
      obj.attributes = attributes;
      objListofLists.add(obj);

   }

   public void endElement(String uri, String localName, String qName) throws SAXException {
      lvl_cnt--;
   }

   public void characters (char ch[], int start, int length) throws SAXException {
     String help = new String(ch, start, length);
     System.out.println(help);
     objListofLists.get(objListofLists.size()-1).setValue(help);
   }
}

【问题讨论】:

    标签: java xml methods character saxparser


    【解决方案1】:

    characters 方法仅打印元素内的 文本(无属性),但也包括所有 空格制表符换行符 可能出现在文档中并且是根元素的后代。

    如果您想读取特定元素内的文本,您应该在输入该元素时设置一个标志(在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 之间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2015-04-12
    相关资源
    最近更新 更多