Java 如何在xml中搜索元素?

Java 如何在xml中搜索元素?,java,xml,search,xmlstreamreader,Java,Xml,Search,Xmlstreamreader,我需要在.xml文件中搜索一个元素。其结构如下: <elements number="3"> <contact> <name>PAUL</name> <code>A1</code> </contact> <contact> <name>LAURA</name> <code>A

我需要在.xml文件中搜索一个元素。其结构如下:

   <elements number="3">
     <contact>
       <name>PAUL</name>
       <code>A1</code>
     </contact>
     <contact>
       <name>LAURA</name>
       <code>A2</code>
     </contact>
     <contact>
       <name>JOHN</name>
       <code>A3</code>
     </contact>
我的解决办法是:

public static String readContactsList(String nameContact) {
       XMLInputFactory xmlif = null;
       XMLStreamReader xmlr = null;

       String contacts = "contacts.xml";

       try {
           xmlif = XMLInputFactory.newInstance();
           xmlr = xmlif.createXMLStreamReader(contacts, new FileInputStream(contacts)); 
            while (xmlr.hasNext()) { 
                switch (xmlr.getEventType()) { 
                case XMLStreamConstants.START_DOCUMENT: 
                    System.out.println("Start Read Doc " + contacts); 
                    break;

                case XMLStreamConstants.START_ELEMENT: 
                    System.out.println("Tag " + xmlr.getLocalName());
                    for (int i = 0; i < xmlr.getAttributeCount(); i++)
                        System.out.printf(" => attribut %s->%s%n", xmlr1.getAttributeLocalName(i), xmlr.getAttributeValue(i)); 
                    break;
                case XMLStreamConstants.END_ELEMENT: 
                    System.out.println("END-Tag " + xmlr.getLocalName()); 
                    break;
                case XMLStreamConstants.COMMENT:
                    System.out.println("// comment " + xmlr.getText()); 
                    break; 
                case XMLStreamConstants.CHARACTERS: 
                    if (xmlr.getText().trim().length() > 0) 
                    if (!xmlr.getText().equals(nameContact)) {
                        xmlr.next();
                    }
                    else 
                    System.out.println("-> " + xmlr.getText()); 
                    break;
            }
               xmlr.next();
            }
       } 
       catch (Exception e) {
           System.out.println("reader initialization error");
           System.out.println(e.getMessage()); 
           }
       return contacts;
   }
public静态字符串readcontacts列表(字符串名称contact){
XMLInputFactory xmlif=null;
XMLStreamReader xmlr=null;
String contacts=“contacts.xml”;
试一试{
xmlif=XMLInputFactory.newInstance();
xmlr=xmlif.createXMLStreamReader(联系人,新文件输入流(联系人));
而(xmlr.hasNext()){
开关(xmlr.getEventType()){
案例XMLStreamConstants.START_文档:
系统输出打印项次(“开始读取文件”+联系人);
打破
案例XMLStreamConstants.START_元素:
System.out.println(“Tag”+xmlr.getLocalName());
对于(int i=0;i属性%s->%s%n”,xmlr1.getAttributeLocalName(i),xmlr.getAttributeValue(i));
打破
案例XMLStreamConstants.END_元素:
System.out.println(“结束标记”+xmlr.getLocalName());
打破
案例XMLStreamConstants.COMMENT:
System.out.println(“//comment”+xmlr.getText());
打破
大小写XMLStreamConstants.CHARACTERS:
if(xmlr.getText().trim().length()>0)
如果(!xmlr.getText().equals(nameContact)){
xmlr.next();
}
其他的
System.out.println(“->”+xmlr.getText());
打破
}
xmlr.next();
}
} 
捕获(例外e){
System.out.println(“读卡器初始化错误”);
System.out.println(e.getMessage());
}
返回联系人;
}
此方法接收一个联系人的姓名(即“LAURA”),并应返回其代码。我错过的是如何滚动.xml文件以及如何访问不同的标记内容

谢谢

以下代码(基于您的代码)应该可以工作,但请注意,如果您切换标签的顺序
,则会失败

另外,请注意,您没有关闭流。只需放置一个
最后{xmlr.close();}
关闭流

   public static String readContactsList(String nameContact) {
        boolean match = false;   
        XMLInputFactory xmlif = null;
        XMLStreamReader xmlr = null;

        String contacts = "contacts.xml";

        try {
            xmlif = XMLInputFactory.newInstance();
            xmlr = xmlif.createXMLStreamReader(contacts, new FileInputStream(contacts)); 
            while (xmlr.hasNext()) { 
                switch (xmlr.getEventType()) { 
                case XMLStreamConstants.START_DOCUMENT: 
                    System.out.println("Start Read Doc " + contacts); 
                    break;

                case XMLStreamConstants.START_ELEMENT: 
                    System.out.println("Tag " + xmlr.getLocalName());    
                    for (int i = 0; i < xmlr.getAttributeCount(); i++)
                        System.out.printf(" => attribut %s->%s%n", xmlr.getAttributeLocalName(i), xmlr.getAttributeValue(i));
                    break;

                case XMLStreamConstants.END_ELEMENT: 
                    System.out.println("END-Tag " + xmlr.getLocalName()); 
                    break;

                case XMLStreamConstants.COMMENT:
                    System.out.println("// comment " + xmlr.getText()); 
                    break; 

                case XMLStreamConstants.CHARACTERS: 
                    if (xmlr.getText().trim().length() > 0) {
                        if (!xmlr.getText().equals(nameContact)) {
                            System.out.println("-> " + xmlr.getText());

                            if (match) {
                                return xmlr.getText();
                            }
                        }
                        else {
                            System.out.println("-> " + xmlr.getText());

                            //This is just in case the name and the code be the same
                            if (match) {
                                return xmlr.getText();
                            }

                            match = true;
                        }
                    }
                    break;
                }
                xmlr.next();
            }
        } 
        catch (Exception e) {
            System.out.println("reader initialization error");
            System.out.println(e.getMessage()); 
        }
        return contacts;
    }
public静态字符串readcontacts列表(字符串名称contact){
布尔匹配=假;
XMLInputFactory xmlif=null;
XMLStreamReader xmlr=null;
String contacts=“contacts.xml”;
试一试{
xmlif=XMLInputFactory.newInstance();
xmlr=xmlif.createXMLStreamReader(联系人,新文件输入流(联系人));
而(xmlr.hasNext()){
开关(xmlr.getEventType()){
案例XMLStreamConstants.START_文档:
系统输出打印项次(“开始读取文件”+联系人);
打破
案例XMLStreamConstants.START_元素:
System.out.println(“Tag”+xmlr.getLocalName());
对于(int i=0;i属性%s->%s%n”,xmlr.getAttributeLocalName(i),xmlr.getAttributeValue(i));
打破
案例XMLStreamConstants.END_元素:
System.out.println(“结束标记”+xmlr.getLocalName());
打破
案例XMLStreamConstants.COMMENT:
System.out.println(“//comment”+xmlr.getText());
打破
大小写XMLStreamConstants.CHARACTERS:
if(xmlr.getText().trim().length()>0){
如果(!xmlr.getText().equals(nameContact)){
System.out.println(“->”+xmlr.getText());
如果(匹配){
返回xmlr.getText();
}
}
否则{
System.out.println(“->”+xmlr.getText());
//这只是为了防止名称和代码相同
如果(匹配){
返回xmlr.getText();
}
匹配=真;
}
}
打破
}
xmlr.next();
}
} 
捕获(例外e){
System.out.println(“读卡器初始化错误”);
System.out.println(e.getMessage());
}
返回联系人;
}