尝试使用 dom4j 解析 XML 时属性值为空

Attribute value is null while trying to parse XML using dom4j

我正在尝试使用 dom4j 解析 XML 字符串。但是当我尝试获取任何节点(元素)的属性值时,它仅 return 空值。

这是我的文件包含 XML:

<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
    <Provider Name='Outlook'/>
    <EventID Qualifiers='16384'>63</EventID>
    <Level>4</Level>
    <Task>0</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime='2015-07-23T13:45:26.000000000Z'/>
    <EventRecordID>27487</EventRecordID>
    <Channel>Application</Channel>
    <Computer>eGLAP0011-PC</Computer>
</System>
<EventData>
    <Data>The Exchange web service request GetAppManifests succeeded. </Data>
</EventData>
</Event>

看下面我的代码:

BufferedReader br = null;
        try
        {
            File inputFile = new File("D:\EventLog\xml_op.txt");
            br = new BufferedReader(new FileReader(inputFile));
            String line="",con_line="";
            int inc =0;
            while((line = br.readLine())!=null)
            {
                con_line+=line;
            }
            Document doc=DocumentHelper.parseText(con_line);
            Element parent_ele = doc.getRootElement();

            for (Iterator i1 = parent_ele.elementIterator("System"); i1.hasNext();)
            {
                 Element Sys = (Element) i1.next();                
                 System.out.println("------------------------------------------------");
                 System.out.println("Provider--> " + Sys.attributeValue("Name")); //I got null value here
                 System.out.println("EventID--> " + Sys.elementText("EventID"));
                 System.out.println("Level--> " + Sys.elementText("Level"));
                 System.out.println("Task--> " + Sys.elementText("Task"));
                 System.out.println("Keywords--> " + Sys.elementText("Keywords"));
                 System.out.println("TimeCreated--> " + Sys.attributeValue("SystemTime"));//I got null value here
                 System.out.println("EventRecordID--> " + Sys.elementText("EventRecordID"));
                 System.out.println("Channel--> " + Sys.elementText("Channel"));
                 System.out.println("Computer--> " + Sys.elementText("Computer"));
                 System.out.println("------------------------------------------------");
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

以上代码的输出:

------------------------------------------------
Provider--> null
EventID--> 63
Level--> 4
Task--> 0
Keywords--> 0x80000000000000
TimeCreated--> null
EventRecordID--> 27487
Channel--> Application
Computer--> eGLAP0011-PC
------------------------------------------------

在上面的输出中,Provider 和 Time Created 的值为空, 我在网站上搜索了很多,但没有找到解决此问题的正确方法,请分享您的想法。提前致谢,

您当前的节点是<System>elementText() 函数搜索那个节点,获取它的文本并打印它,但是 attributeValue() 指的是当前节点,所以你必须前进到目标并在那里调用它,比如:

System.out.println("Provider--> " + Sys.element("Provider").attributeValue("Name"));

System.out.println("TimeCreated--> " + Sys.element("TimeCreated").attributeValue("SystemTime"));

所以,在您的代码中替换它并试一试。它产生:

------------------------------------------------
Provider--> Outlook
EventID--> 63
Level--> 4
Task--> 0
Keywords--> 0x80000000000000
TimeCreated--> 2015-07-23T13:45:26.000000000Z
EventRecordID--> 27487
Channel--> Application
Computer--> eGLAP0011-PC
------------------------------------------------