2012-09-04 35 views
0

我使用java.I有一個XML文件,它看起來像這樣:如何提取XML標記值而不使用java中的標記名?

<?xml version="1.0"?> 
     <personaldetails> 
      <phno>1553294232</phno> 
      <email> 
       <official>[email protected]</official> 
       <personal>[email protected]</personal> 
      </email> 
     </personaldetails> 

現在,我需要檢查每一個使用特定條件的類型的變量值,並把它們放在不同的文件。

例如,在上面的文件,我這樣寫10個數字的條件等於電話號碼, 東西[email protected]的格式是電子郵件..

所以,我需要做的是我需要在每個標籤中提取標籤值,並且如果它符合某個條件,它將放入第一個文本文件中,如果不在第二個文本文件中。 在這種情況下,第一個文本文件將包含:

1553294232 
[email protected] 
[email protected] 

和值的第二個文件的其餘部分。

我只是不知道如何提取標籤值而不使用標籤名稱(或不使用GetElementsByTagName)。 我的意思是這段代碼應該提取電子郵件[email protected],即使我給< mailing>而不是<personal>標籤。它不應該依賴於標籤名稱。

希望我不會混淆。我是使用xml的java的新手。所以,如果我的問題很愚蠢,請原諒我。 請幫助。

+0

啊,等等。 getElementsByTagName()是Javascript,而不是Java。 – Ixx

+1

@lxx:它也在'Java'中。作爲['Element']的一部分(http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/Element.html#getElementsByTagName(java.lang.String))'class ' – Sujay

+1

啊,好的!反正我爲這兩種情況寫了答案;) – Ixx

回答

2

似乎是一個典型的用例XPath

XPath允許您查詢XML以非常靈活的方式。

本教程可以幫助:

http://www.javabeat.net/2009/03/how-to-query-xml-using-xpath/

如果您使用的是Java腳本,這可能是這種情況,因爲你提到的getElementsByTagName(),你可以只使用jQuery選擇,它會給你一個跨瀏覽器的一致的行爲,如果你還沒有使用它,JQuery庫對很多其他的東西都是有用的... http://api.jquery.com/category/selectors/

在這裏例如是關於這方面的信息:

http://www.switchonthecode.com/tutorials/xml-parsing-with-jquery

1

既然你不知道你的名字element,我建議建立一個DOM樹,並通過它迭代。當你得到一個element,你會嘗試匹配它與你的ruleset,我會建議使用regex爲此目的)然後把它寫到你的文件。

這將是一個樣本結構,以幫助您開始使用,但您需要根據您的需要進行修改:

public void parseXML(){ 
    try{ 
     DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document doc; 

     doc = documentBuilder.parse(new File("test.xml")); 
     getData(null, doc.getDocumentElement()); 
    }catch(Exception exe){ 
     exe.printStackTrace(); 
    } 
} 

private void getData(Node parentNode, Node node){ 

    switch(node.getNodeType()){ 
     case Node.ELEMENT_NODE:{ 

      if(node.hasChildNodes()){ 
       NodeList list = node.getChildNodes(); 
       int size = list.getLength(); 

       for(int index = 0; index < size; index++){ 
        getData(node, list.item(index)); 
       } 
      } 

      break; 
     } 

     case Node.TEXT_NODE:{ 
      String data = node.getNodeValue(); 

      if(data.trim().length() > 0){ 
       /* 
       * Here you need to check the data against your ruleset and perform your operation 
       */ 
       System.out.println(parentNode.getNodeName()+" :: "+node.getNodeValue()); 
      } 
      break; 
     } 

    } 
} 

你可能想看看Chain of Responsibility設計模式來設計你的規則集。

+1

誰低估了這個答案:你能解釋爲什麼嗎?這將幫助我提高我的答案,如果你覺得我對這個問題的理解存在差距 – Sujay

+0

Thankuu Sujay和lxx..Thanku Sujay cuz我得到了我的輸出:) – user1644803

+0

樂於幫助,並歡迎來到Stack Overflow。如果此答案或任何其他人解決了您的問題,請[請將其標記爲已接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Sujay