Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据xml中一个属性的值获取标记属性值_Java_Android_Xml_Sax_Xpath 2.0 - Fatal编程技术网

Java 根据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

我正在为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="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());
    }
}