2016-09-19 82 views
0

我一直試圖讓這一段時間現在很少或沒有成功。現在,我真的沒有選擇。我會感謝一些幫助或者指向正確的方向......因爲我相信我沒有做得很好。Stax API XML解析產生空結果

用下面的代碼解析後,我有空值在大多數字段:Result{id=30c26c8a-8bdf-4d4d-8f8d-a19661f16877, name=Andriod_Office_Task, owner [email protected], comment=, creationTime=2016-09-09T19:30, modificationTime=2016-09-09T19:30:05+02:00, reportId=null, taskid=null, host=null, port=null, nvt=null, scanNVTVersion=null, threat=null, severity=null, description=null}

解析方法(其它方法被排除爲了簡潔):

private List<Result> readDocument(XMLStreamReader parser) throws   XMLStreamException, DatatypeConfigurationException { 
    List<Result> results = new ArrayList<>(); 

    while (parser.hasNext()) { 
     int eventType = parser.next(); 
     switch (eventType) { 
     case XMLStreamReader.START_ELEMENT: 
      String elementName = parser.getLocalName(); 
      if (elementName.equals("result")) 
       results.add(readResult(parser)); 
      break; 
     case XMLStreamReader.END_ELEMENT: 
      return results; 

     } 
    } 
    throw new XMLStreamException("Premature end of file"); 
} 

public Result readResult(XMLStreamReader parser) throws XMLStreamException, DatatypeConfigurationException { 

    Result result = new Result(); 
    result.setId(parser.getAttributeValue(null, "id")); 


    Report report = new Report(); 

    Task task = new Task(); 

    while (parser.hasNext()) { 
     int eventType = parser.next(); 
     switch (eventType) { 
     case XMLStreamReader.START_ELEMENT: 
      String elementName = parser.getLocalName(); 
      if (elementName.equals("name")) 
       result.setName(readCharacters(parser)); 
      else if (elementName.equals("host")) 
       result.setHost(readCharacters(parser)); 
      else if (elementName.equals("owner")) 
       result.setOwner(readOwner(parser)); 
      else if (elementName.equals("comment")) 
       result.setComment(readCharacters(parser)); 
      else if (elementName.equals("creation_time")) 

       result.setCreationTime(readCreationTime(parser)); 

      else if (elementName.equals("modification_time")) 
       result.setModificationTime(readCharacters(parser)); 
      else if (elementName.equals("report")) 
       report.setId(readReport(parser)); 
      else if (elementName.equals("task")) 
       task.setId(readTask(parser)); 
      else if (elementName.equals("user_tags")) 
       result.setUserTags(readUserTags(parser)); 
      else if (elementName.equals("port")) 
       result.setPort(readCharacters(parser)); 
      else if (elementName.equals("nvt")) 
       result.setNvt(readNvt(parser)); 
      else if (elementName.equals("scan_nvt_version")) 
       result.setScanNVTVersion(readCharacters(parser)); 
      else if (elementName.equals("threat")) 
       result.setThreat(readCharacters(parser)); 
      else if (elementName.equals("severity")) 
       result.setSeverity(readCharacters(parser)); 
      else if (elementName.equals("qod")) 
       result.setQod((Qod) readQod(parser)); 
      else if (elementName.equals("description")) 
       result.setDescription(readCharacters(parser)); 

      break; 
     case XMLStreamReader.END_ELEMENT: 
     } 
     return result; 

    } 

    throw new XMLStreamException("Premature end of file"); 
} 

private String readCharacters(XMLStreamReader reader) throws XMLStreamException { 
    StringBuilder result = new StringBuilder(); 
    while (reader.hasNext()) { 
     int eventType = reader.next(); 
     switch (eventType) { 
     case XMLStreamReader.CHARACTERS: 
      result.append(reader.getText()); 
      break; 
     case XMLStreamReader.END_ELEMENT: 
      return result.toString(); 
     } 
    } 
    throw new XMLStreamException("Premature end of file"); 
} 


} 

結果類是下面:

@XmlRootElement 
    @XmlAccessorType(XmlAccessType.FIELD) 
    @JsonIgnoreProperties(ignoreUnknown = true) 
    public class Result { 

@XmlAttribute 
private String id; 

@XmlElement 
private String name; 

@XmlElement 
private Task task; 

@XmlElement 
private String comment; 

@XmlElement(name = "creation_time") 
String creationTime; 

@XmlElement(name = "modification_time") 
private String modificationTime; 

// TODO user_tags 
@XmlElement 
private UserTags userTags; 

@XmlElement 
private Owner owner; 

@XmlElement 
private Qod qod; 

/** 
* // * The report the result belongs to (only when details were requested) 
* // 
*/ 
@XmlElementWrapper(name = "report") 
@XmlElement(name = "reportId") 
private String reportId; 

@XmlElement 
private String host; 

@XmlElement 
private String port; 

@XmlElement 
private NVT nvt; 

@XmlElement(name = "scan_nvt_version") 
private String scanNVTVersion; 

@XmlElement 
private String threat; 

@XmlElement 
private String severity; 

@XmlElement 
private String description; 

public Result() { 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 



public Task getTask() { 
    return task; 
} 


public void setTask(Task task) { 
    this.task = task; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getComment() { 
    return comment; 
} 

public void setComment(String comment) { 
    this.comment = comment; 
} 

public String getCreationTime() { 
    return creationTime; 
} 

public void setCreationTime(String creationTime) { 
    this.creationTime = creationTime; 
} 

public String getModificationTime() { 
    return modificationTime; 
} 

public void setModificationTime(String modificationTime) { 
    this.modificationTime = modificationTime; 
} 

public UserTags getUserTags() { 
    return userTags; 
} 

public void setUserTags(UserTags userTags) { 
    this.userTags = userTags; 
} 

public Qod getQod() { 
    return qod; 
} 

public void setQod(Qod qod) { 
    this.qod = qod; 
} 

public Owner getOwner() { 
    return owner; 
} 

public void setOwner(Owner owner) { 
    this.owner = owner; 
} 

public String getReportId() { 
    return reportId; 
} 

public void setReportId(String reportId) { 
    this.reportId = reportId; 
} 



public String getHost() { 
    return host; 
} 

public void setHost(String host) { 
    this.host = host; 
} 

public String getPort() { 
    return port; 
} 

public void setPort(String port) { 
    this.port = port; 
} 

public NVT getNvt() { 
    return nvt; 
} 

public void setNvt(NVT nvt) { 
    this.nvt = nvt; 
} 

public String getScanNVTVersion() { 
    return scanNVTVersion; 
} 

public void setScanNVTVersion(String scanNVTVersion) { 
    this.scanNVTVersion = scanNVTVersion; 
} 

public String getThreat() { 
    return threat; 
} 

public void setThreat(String threat) { 
    this.threat = threat; 
} 

public String getSeverity() { 
    return severity; 
} 

public void setSeverity(String severity) { 
    this.severity = severity; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

@Override 
public String toString() { 
    return "Result{" + "id=" + id + 
    ", name=" + name + ", owner =" + owner + 
      ", comment=" + comment + ", creationTime=" + creationTime + ", modificationTime=" + modificationTime 
      + ", reportId=" + reportId + ", taskid=" + task + ", host=" + host + ", port=" + port + ", nvt=" + nvt 
      + ", scanNVTVersion=" + scanNVTVersion + ", threat=" + threat + ", severity=" + severity 
      + ", description=" + description + '}'; 
} 

} 
<get_results_response status="200" status_text="OK"> 
    <result id="30c26c8a-8bdf-4d4d-8f8d-a19661f16877"> 
     <name>Trace route</name> 
     <owner> 
      <name>admin</name> 
     </owner> 
     <comment/> 
     <creation_time>2016-09-09T19:30:05+02:00</creation_time> 
     <modification_time>2016-09-09T19:30:05+02:00</modification_time> 
     < id="2a6d7f75-f6b7-40b2-a792-b558fada375b"/> 
     <task id="e59ac66b-5b59-4756-bace-37bb1106276d"> 
      <name>Andriod_Office_Task</name> 
     </task> 
     <user_tags> 
      <count>0</count>re 
     </user_tags> 
     <host>172.16.53.178</host> 
     <port>general/tcp</port> 
     <nvt oid="1.3.6.1.4.1.25623.1.0.51662"> 
      <name>Traceroute</name> 
      <family>General</family> 
      <cvss_base>0.0</cvss_base> 
      <cve>NOCVE</cve> 
      <bid>NOBID</bid> 
      <xref>NOXREF</xref> 
      <tags>cvss_base_vector=AV:N/AC:L/Au:N/C:N/I:N/A:N|qod_type=remote_banner|solution=Block unwanted packets from escaping your network.|summary=A traceroute from the scanning server to the target system was 
conducted. This traceroute is provided primarily for informational 
value only. In the vast majority of cases, it does not represent a 
vulnerability. However, if the displayed traceroute contains any 
private addresses that should not have been publicly visible, then you 
have an issue you need to correct.</tags> 
      <cert/> 
     </nvt> 
     <scan_nvt_version>$Revision: 2837 $</scan_nvt_version> 
     <threat>Log</threat> 
     <severity>0.0</severity> 
     <qod> 
      <value>80</value> 
      <type>remote_banner</type> 
     </qod> 
     <description>Here is the route from 192.168.14.128 to 172.16.53.178: 

192.168.14.128 
172.16.53.178</description> 
    </result> 
    <filters id=""> 
     <term>first=1 rows=-1 sort=name</term> 
     <keywords> 
      <keyword> 
       <column>first</column> 
       <relation>=</relation> 
       <value>1</value> 
      </keyword> 
      <keyword> 
       <column>rows</column> 
       <relation>=</relation> 
       <value>-1</value> 
      </keyword> 
      <keyword> 
       <column>sort</column> 
       <relation>=</relation> 
       <value>name</value> 
      </keyword> 
     </keywords> 
    </filters> 
    <sort> 
     <field>name 
      <order>ascending</order></field> 
    </sort> 
    <results max="-1" start="1"/> 
    <result_count>3444 
     <filtered>1</filtered> 
     <page>1</page></result_count> 
</get_results_response> 
+0

這是太多的代碼,通過人工挖......請留言https://stackoverflow.com/help/mcve幷包含您使用的XML輸入。在調試器中瀏覽代碼。我最好的猜測是你從'readDocument'返回。 – Robert

+0

@Robert感謝您的建議,我現在已經將代碼縮減爲最重要的代碼(方法),並且還包含了xml文件。 – SyCode

回答

0

經過一些研究並嘗試了一些常見的xml解析方法後,我最終使用了 jackson-dataformat-xml approach。雖然這可能不是最好的,但它以更少的代碼給了我想要的東西。基本上,我不得不在下面的模型類註釋適應:

@JsonIgnoreProperties(ignoreUnknown=true) 
@JacksonXmlRootElement(localName = "results") 
public class Results { 


@JacksonXmlProperty(localName = "result") 
@JacksonXmlElementWrapper(useWrapping = false) 
public Result [] result; 


public Results() { 
     } 


public Result[] getResult() { 
    return result; 
} 


public void setResult(Result[] result) { 
    this.result = result; 
} 


@Override 
public String toString() { 
    return "Results [result=" + Arrays.toString(result) + "]"; 
} 

還有一些改編的解析類:

public class GetReportsResponseHandler extends DefaultHandler<GetReportsResponse> { 

private XmlMapper mapper = new XmlMapper(); 
public GetReportsResponseHandler() { 
super(new GetReportsResponse(), "get_reports_response"); 
AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); 
AnnotationIntrospector secondary = new JaxbAnnotationIntrospector(); 
AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary,   secondary); 
mapper.setAnnotationIntrospector(pair); 
} 

@Override 
protected void parseStartElement(XMLStreamReader parser) throws XMLStreamException, IOException { 
    if ("report".equals(parser.getName().toString())){ 
     Report report = mapper.readValue(parser, Report.class); 
     response.addReport(report); 
    }