2016-03-23 9 views
0

Bir xml dosyam var. Java kullanarak xml dosyasında ana etiketin (Body) alt alt etiketini almam gerekiyor. Öncelikle elemanını okumak ve yerel makine sürücümden xml dosyası almak için DOM kullanmalıyım. Tek bir String'im var (Sring getSubChildValue = "181_paragraph_13") ve değerini Xml dosyasındaki her bir özellik Değeri ile karşılaştırmam gerekiyor. Verilen Değer alt alt etiketinde olabilirse, bir Değer elde edebiliriz.Java kullanarak öznitelik değerini ve verilen dize değerini karşılaştırarak xml'de alt çocuğun etiket adını almam gerekir mi?

  1. Ben dize değişkeni karşılaştırmak için ve XML dosyası ile yapmanız gerekenler
  2. Ben dize değeri herhangi attrinbute Değeri eşitse baskı için Etiket adını yapmanız gerekenler.
  3. Örnek: (P) Etiket, belirtilen String Değerini içeren Etiketin (Body) alt alt öğesidir. Bu yüzden etiket adını almam gerekiyor.
  4. Çözüm almak için alt alt Adın kodlanması nasıl önlenir?

Örnek XML dosyası:

<parent> 
<Body class="student" id="181_student_method_3"> 
<Book class="Book_In_School_11" id="181_student_method_11"/> 
<subject class="subject_information " id="181_student_subject_12"/> 
<div class="div_passage " id="181_div_method_3"> 
<p class=" paragraph_book_name" id="181_paragraph_13"> 
<LiberaryBook class="Liberary" id="181_Liberary_9" > 
<Liberary class="choice " 
id="Liberary_replace_1" Uninversity="University_Liberary_1"> 
Dubliners</Liberary> 
<Liberary class="choice " 
id="Liberary_replace_2" Uninversity="University_Liberary_2"> 
Adventure if sherlock Holmes</Liberary> 
<Liberary class="choice " 
id="Liberary_replace_3" Uninversity="University_Liberary_3"> 
Charlotte’s Web</Liberary> 
<Liberary class="choice " 
id="Liberary_replace_4" Uninversity="University_Liberary_4"> 
The Outsiders</Liberary> 
</LiberaryBook> 
</p> 
</div> 
</Body> 
</parent> 

Örnek Java kodu:

Bu yöntem kontrol etmek için kullanılır //
import java.io.File; 
import java.io.IOException; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 
public class PerfectTagChange { 
public static void main(String[] args) { 
    String filePath = "/xmlfile/Xml/check/sample.xml"; 
    File xmlFile = new File(filePath); 
    DocumentBuilderFactory 
dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder; 
    try { 
     dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(xmlFile); 
     doc.getDocumentElement().normalize(); 
     Element root = doc.getDocumentElement(); 
     changeValue(root,doc); 
     doc.getDocumentElement().normalize(); 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File("/xmlfile/Xml/check/Demo.xml")); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.transform(source, result); 
     System.out.println("XML file updated successfully"); 

    } catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) { 
     e1.printStackTrace(); 
    } 
} 

hangi özellik verilmiş dize Değerini içerir: Sabit kod üst etiketi, Ama başka bir etiket yok.

private static void changeValue(Node someNode,Document doc) { 
    Sring getSubChildValue = "181_paragraph_13" 
    NodeList childs = someNode.getChildNodes(); 
    for (int in = 0; in < childs.getLength();) { 
     Node child = childs.item(in); 
     if (child.getNodeType() == Document.ELEMENT_NODE) { 
      if (child.getNodeName().equalsIgnoreCase("Body")) { 
      //If I hard code the ID here on getNamedItem("id"), 
       If the attribute Name got Changed from ID to Name 
       it will be in problem. 
      //3.What is the solution for solving the problem. 
      if(child.getAtrribute.getNamedItem("id").getNodeValue().equals(getSubChildValue)){ 
      system.out.println(child.getAtrribute.getNamedItem("id").getNodeValue()); 
      } 
     } 
    } 
} 
} 
+0

Neden tüm düğümleri verilen değere almak için XPath kullanmıyorsunuz? XPath xPath = XPathFactory.newInstance(). NewXPath(); NodeList düğümleri = (NodeList) xPath.evaluate ("// [@ id =" + 181_paragraph_13 + "]", doc.getDocumentElement(), XPathConstants.NODESET) ; – Frank

cevap

1

Bu kodunuzu değiştirirseniz:

private static void changeValue(Node someNode, Document doc, String searchString) throws Exception { 
    XPath xPath = XPathFactory.newInstance().newXPath(); 
    NodeList nodes = (NodeList) xPath.evaluate("//*[@*=\"" + searchString + "\"]", 
               doc.getDocumentElement(), 
               XPathConstants.NODESET); 

    for (int i = 0; i < nodes.getLength(); i++) { 
     System.out.println("Tagname: " + nodes.item(i).getNodeName()); 
    } 
} 

Eğer özelliğin adı kodlanmış olması gerekmez.

DÜZENLEME: Parametre olarak searchString eklendi.

+0

@Hi Frank: dize değerini doğrudan xpath.evaluate() içinde kullanıyorsunuz, Query: String değeri yerine string değişken adını kullanabilir miyim? –

+0

Dinamik arama dizelerini etkinleştirmek için kod örneğimi değiştirdim. – Frank

+0

Frank: Cevabım var. Ama sorumu sadece Body Tag içinde kontrol etmek. Bir tane daha etiketim de Body etiketinin dışında bir değere sahipse, diğer değeri de yazdıracaktır. Çünkü onu doc.getDocumentElement() olarak aldınız. Bundan kaçınmam gereken ... –

İlgili konular