有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的Xml解析问题

这是我要解析的xml

<object pk="1" model="test">
    <field type="BigIntegerField" name="number">100809206</field>
    <field type="CharField" name="id">11700632</field>
    <field name="test123">
        <object pk="1" model="employee">
            <field type="DateTimeField" name="updated_on">27 Nov, 2014, 17:18 hrs</field>
            <field type="CharField" name="EmployeeName">ABC</field>
        </object>
        <object pk="2" model="employee">
            <field type="DateTimeField" name="updated_on">28 Nov, 2014, 17:18 hrs</field>
            <field type="CharField" name="EmployeeName">XYZ</field>
        </object>
        <object pk="3" model="employee">
            <field type="DateTimeField" name="updated_on">28 Nov, 2014, 17:18 hrs</field>
            <field type="CharField" name="EmployeeName">XYZ</field>
        </object>
    </field>
</object>

我的密码

BufferedReader in = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null)
{
    response.append(inputLine);
}
in.close();

if(response != null && !"".contains(response))
{
    SAXBuilder saxBuilder = new SAXBuilder();
    Document doc = saxBuilder.build(new StringReader(response.toString()));
    Element rootEle = doc.getRootElement();
    List childList = rootEle.getChildren();
    System.out.println(childList.toString());
    for(i=0;i<childList.size();i++)
    {
        Element shipment= (Element) childList.get(i);
        if(shipment != null)
        {
            List dataList  = shipment.getChildren();
            if(dataList != null && dataList.size() > 0)
            {
                List dataList  = shipment.getChildren();
                if(dataList != null && dataList.size() > 0)
                {
                    XMLOutputter xmlOutput = new XMLOutputter();
                    String shipmentXml = xmlOutput.outputString(shipment);
                    InputSource source = new InputSource(new StringReader(shipmentXml));
                    org.w3c.dom.Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
                    XPath xpath = XPathFactory.newInstance().newXPath();

                    String number = (xpath.evaluate("/object/field[@name ='number']", document).trim());
                    String name = (xpath.evaluate("/object/field[@name ='id']", document).trim());
                }
            }
        }
    }
}

我能得到姓名和身份证

<field type="BigIntegerField" name="number">100809206</field>
<field type="CharField" name="id">11700632</field>

但无法使用xpath获取以下字段

<field name="test123">
        <object pk="1" model="employee">
            <field type="DateTimeField" name="updated_on">27 Nov, 2014, 17:18 hrs</field>
            <field type="CharField" name="EmployeeName">ABC</field>
        </object>
        <object pk="2" model="employee">
            <field type="DateTimeField" name="updated_on">28 Nov, 2014, 17:18 hrs</field>
            <field type="CharField" name="EmployeeName">XYZ</field>
        </object>
 </field>

如何获得值“2014年11月27日17:18小时”和ABC使用属性“分别更新”和“员工姓名”

这两个标签不同,可以从2个更改为5个或更多。。我想在for循环中迭代它 然后放进豆子里。。所以我们想要基于for循环中标记名称的值

所以。。基本上,我想计算出在<field name="test123">中有多少<object pk="1" model="employee">标记可用,并想使用字段updated_on and EmployeeName迭代for循环中的每个<object>标记,获取它们的值并放入java bean


共 (1) 个答案

  1. # 1 楼答案

    how to get value "27 Nov, 2014, 17:18 hrs" and ABC using attribute "updated_on and EmployeeName respectively

    获取field[@type = 'DateTimeField']的正确路径表达式是

    /object/field/object/field[@name = 'updated_on']
    

    并且得到field[@type = 'CharField']

    /object/field/object/field[@name = 'EmployeeName']
    

    你没有说为什么你无法检索这些节点,但我怀疑如下:很可能,你试图用一个表达式找到它们,比如

    /object/field[@name ='updated_on']
    

    只有当XML的结构如下时,它才会起作用:

    <object>
      <field name="updated_on"/>
    </object>
    

    事实上,结构是

    <object>
        <field>
            <object>
                <field name="updated_on"/>
            </object>
        </field>
    </object>
    

    查找树中任何位置的元素只能通过//完成:

    //object/field[@name ='updated_on']