Java 如何在xml中搜索元素?
我需要在.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
<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());
}
返回联系人;
}