Java 根据xml中一个属性的值获取标记属性值
我正在为android制作一个应用程序,并从一个在线的xml文件中提取和解析标记属性的值。假设xml文件如下所示Java 根据xml中一个属性的值获取标记属性值,java,android,xml,sax,xpath-2.0,Java,Android,Xml,Sax,Xpath 2.0,我正在为android制作一个应用程序,并从一个在线的xml文件中提取和解析标记属性的值。假设xml文件如下所示 <a> <b> <c id="00001" time="1:00" day="Friday" name1="John" name2="Mary"></c> <c id="00002" time="2:00" day="Monday" name1="Ed" name2="Kate"></c> <c id="0
<a>
<b>
<c id="00001" time="1:00" day="Friday" name1="John" name2="Mary"></c>
<c id="00002" time="2:00" day="Monday" name1="Ed" name2="Kate"></c>
<c id="00003" time="3:00" day="Sunday" name1="Mary" name2="Ed"></c>
<c id="00004" time="4:00" day="Friday" name1="Kate" name2="John"></c>
</b>
</a>
该应用程序将有一个固定的名称(例如John、Ed、Mary、Kate),我想为名称出现在哪一行以及名称所在的属性(例如name1、name2)提取标记属性的值,名称将保持不变,但它会根据周数移动行和属性
我搜索了答案,发现我很可能会使用XPath。有谁能帮我解决这个问题吗?我的解析方法对使用xpath重要吗?DOM还是SAX
提前谢谢 提供了一个很好的介绍,但这里也有一些示例代码:
InputSource xml = new InputSource(new StringReader("<a>\n" +
"<b>\n" +
"<c id=\"00001\" time=\"1:00\" day=\"Friday\" name1=\"John\" name2=\"Mary\"></c>\n" +
"<c id=\"00002\" time=\"2:00\" day=\"Monday\" name1=\"Ed\" name2=\"Kate\"></c>\n" +
"<c id=\"00003\" time=\"3:00\" day=\"Sunday\" name1=\"Mary\" name2=\"Ed\"></c>\n" +
"<c id=\"00004\" time=\"4:00\" day=\"Friday\" name1=\"Kate\" name2=\"John\"></c>\n" +
"</b>\n" +
"</a>"));
如果元素名c
在整个文档中是唯一的,则可以将XPath表达式缩减为//c[@name1='%s']
如果需要同时匹配name1
和name2
,请使用此节点测试:[@name1='%s'或@name2='%s']
。在这种情况下,您可能还需要从evaluate()
获取NodeList
来处理多个匹配:
NodeList c = (NodeList) xpath.evaluate(expr, xml, XPathConstants.NODESET);
上面的答案是,关于xpath可能是最好的方法。但是,如果您想从xml图实际创建POJO,可以使用XStream之类的东西对xml进行反序列化,或者在更复杂的xml结构中,可以使用Trang从xml创建模式,然后使用jaxb xjc工具创建java类 以您的示例为例,我编写了一个小程序,展示了如何使用XStream实现此功能: 您可以在此处获得XStream的二进制或源发行版: 网站上有一些简单的例子,他们说它可以在Android上运行 这是我的密码:
package misc;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
public class ProcessMyXml {
@XStreamAlias("c")
public static class c{
//<c id="00001" time="1:00" day="Friday" name1="John" name2="Mary"></c>
@XStreamAsAttribute
String time;
@XStreamAsAttribute
String day;
@XStreamAsAttribute
String name1;
@XStreamAsAttribute
String name2;
@Override
public String toString() {
return time+","+day+","+name1+","+name2;
}
}
public static class bClass{
@XStreamImplicit
List<c> cList;
}
@XStreamAlias("a")
public static class a{
bClass b;
}
public static void main(String[] args) {
XStream xs = new XStream();
xs.processAnnotations(a.class);
Reader reader = new StringReader("<a>\n" +
"<b>\n" +
"<c id=\"00001\" time=\"1:00\" day=\"Friday\" name1=\"John\" name2=\"Mary\"></c>\n" +
"<c id=\"00002\" time=\"2:00\" day=\"Monday\" name1=\"Ed\" name2=\"Kate\"></c>\n" +
"<c id=\"00003\" time=\"3:00\" day=\"Sunday\" name1=\"Mary\" name2=\"Ed\"></c>\n" +
"<c id=\"00004\" time=\"4:00\" day=\"Friday\" name1=\"Kate\" name2=\"John\"></c>\n" +
"</b>\n" +
"</a>");
a aFromFile = (a)xs.fromXML(reader);
List<c> cList = aFromFile.b.cList;
for(c current_c:cList){
System.out.println(current_c.toString());
}
}
package杂项;
导入java.io.Reader;
导入java.io.StringReader;
导入java.util.List;
导入com.thoughtworks.xstream.xstream;
导入com.thoughtworks.xstream.annotations.XStreamAlias;
导入com.thoughtworks.xstream.annotations.XStreamAsAttribute;
导入com.thoughtworks.xstream.annotations.XStreamImplicit;
公共类ProcessMyXml{
@XStreamAlias(“c”)
公共静态c类{
//
@XStreamAsAttribute
串时间;
@XStreamAsAttribute
弦日;
@XStreamAsAttribute
字符串名称1;
@XStreamAsAttribute
字符串名称2;
@凌驾
公共字符串toString(){
返回时间+”、“+day+”、“+name1+”、“+name2”;
}
}
公共静态类B类{
@XStreamImplicit
列表cList;
}
@XStreamAlias(“a”)
公共静态a类{
b类;
}
公共静态void main(字符串[]args){
XStream xs=新的XStream();
processAnnotations(a.class);
读卡器=新的StringReader(“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
"");
a aFromFile=(a)xs.fromXML(读取器);
List cList=aFromFile.b.cList;
用于(c当前_c:cList){
System.out.println(current_c.toString());
}
}
}非常感谢您!!在尝试实现此功能时,我在“xpath.evaluate(expr,xml,XPathConstants.NODE);”上获得了一个“未处理的异常类型XPathExpressionException”;捕获并记录它,或者让方法抛出它并进一步捕获+记录。
package misc;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
public class ProcessMyXml {
@XStreamAlias("c")
public static class c{
//<c id="00001" time="1:00" day="Friday" name1="John" name2="Mary"></c>
@XStreamAsAttribute
String time;
@XStreamAsAttribute
String day;
@XStreamAsAttribute
String name1;
@XStreamAsAttribute
String name2;
@Override
public String toString() {
return time+","+day+","+name1+","+name2;
}
}
public static class bClass{
@XStreamImplicit
List<c> cList;
}
@XStreamAlias("a")
public static class a{
bClass b;
}
public static void main(String[] args) {
XStream xs = new XStream();
xs.processAnnotations(a.class);
Reader reader = new StringReader("<a>\n" +
"<b>\n" +
"<c id=\"00001\" time=\"1:00\" day=\"Friday\" name1=\"John\" name2=\"Mary\"></c>\n" +
"<c id=\"00002\" time=\"2:00\" day=\"Monday\" name1=\"Ed\" name2=\"Kate\"></c>\n" +
"<c id=\"00003\" time=\"3:00\" day=\"Sunday\" name1=\"Mary\" name2=\"Ed\"></c>\n" +
"<c id=\"00004\" time=\"4:00\" day=\"Friday\" name1=\"Kate\" name2=\"John\"></c>\n" +
"</b>\n" +
"</a>");
a aFromFile = (a)xs.fromXML(reader);
List<c> cList = aFromFile.b.cList;
for(c current_c:cList){
System.out.println(current_c.toString());
}
}