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都是不同的,那么应该没有任何问题。但请注意,重复的身份证明。我应该怎么做呢?
答案 0 :(得分:0)
您可以为此申请两个概念。
您可以使用处理程序解析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);
注意这不是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());
}
注意完全未经测试的代码