如何在SAX解析器[Java]中对具有类似父标记属性id的元素进行分组

时间:2017-06-28 04:19:20

标签: java xml arraylist saxparser

xml示例:

<name>item1</name>
<reference_id>100</reference_id> -->notice of the duplicate reference id

<name>item 2</name>
<reference_id>200</reference_id>

<name>item 3</name>
<reference_id>100</reference_id> -->notice of the duplicate reference id

<name>item 4</name>
<reference_id>400</reference_id>

我有一个大的xml文件,我使用SAX Parser根据元素标记提取数据但由于SAX Parser不遵循层次结构,并且每个元素属性或标记都是纯粹标识并添加到相应的arraylist中。

当前输出:

name: [item 1, item 2, item 3, item 4]

reference_id :[100, 200, 100, 400]

当前问题:

我想在用户输入关键字并且能够显示结果时创建方法。

例如,如果用户输入第1项作为关键字, 我的想法是在名称arraylist中获取关键字的位置,并从arraylist引用id中检索相同的位置,因为它是一对一的匹配。所以在这种情况下是name [0] = reference_id [0]。

但问题是当我将引用id过滤为关键字时。引用id如何告诉它链接到哪个名称?假设所有引用id都是不同的,那么应该没有任何问题。但请注意,重复的身份证明。我应该怎么做呢?

1 个答案:

答案 0 :(得分:0)

您可以为此申请两个概念。

概念1使用默认处理程序

您可以使用处理程序解析XML,因为处理程序使用start和end元素方法处理构建所需对象所需的每个节点。

我将把数据存储在名为

的对象中
public class Name
{
  private String name = null;
  private String value = null;

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public String getValue()
  {
    return value;
  }

  public void setValue(String value)
  {
    this.value = value;
  }
}

默认处理程序类

public class NameHandler extends DefaultHandler
{
  private ArrayList<Name> nameList;
  private Name name = null;
  private boolean nameTag = false;
  private boolean valueTag = false;


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

    if (qName.equalsIgnoreCase("name"))
    {
      name = new Name();
      nameTag = true;
    }
    if (qName.equalsIgnoreCase("reference_id"))
    {
      valueTag = true;
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException
  {
    if (qName.equalsIgnoreCase("name"))
    {
      //add Name object to list
      nameList.add(name);         
    }
  }

  @Override public void characters(char[] ch, int start, int length) throws SAXException
  {
    String theValue = new String(ch, start, length);
    if (nameTag)
    {
      name.setName(theValue);
      nameTag = false;
    }
    if (valueTag)
    {
      name.setValue(theValue);
      valueTag= false;
    }
  }

  public ArrayList<Name> getNameList()
  {
    return nameList;
  }
}

调用所有这些的代码只是

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
NameHandler handler = new NameHandler();
saxParser.parse(XML,handler);

使用XML文档的概念2 XML路径

  

注意这不是SAX

输入

可以构建和支持XML路径
String expression = "/root[name='item 2']/reference_id";

NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
   System.out.println(nodeList.item(i).getFirstChild().getNodeValue()); 
}
  

注意完全未经测试的代码