2012-04-04 3 views
2

Ich bin aufgrund von Leerzeichen in der XML-Datei mit einem Problem konfrontiert. Ich möchte Daten aus XML lesen, aber ich habe verschiedene Probleme aufgrund von Leerzeichen zwischen den Knoten.XML kann aufgrund von Leerzeichen in der XML-Datei nicht gelesen werden

Ex.

If a node has 4 childs, due to the spaces it shows 9 childs to the node. So when I try to display node values in table, some columns without heading and without data are also created.

When I removed these spaces I read my file successfully without any problem.

Wie ein solches Problem beheben? Denn ich kann nicht immer weiße Flecken aus der Datei entfernen, da ich mehrere XML-Dateien lese. Es wird also mühsam sein, Leerzeichen aus jeder Datei zu entfernen.

Document doc; 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
doc = dBuilder.parse(fp); 
doc.getDocumentElement().normalize();    
NodeList nList = doc.getElementsByTagName("parameter"); 
nodeName = name; 
for (int temp = 0; temp < nList.getLength();temp++) 
{ 
    Node nNode = (Node) nList.item(temp); 
    Element eElement = (Element) nNode; 
    String upname1 = getTagValue("name", eElement); 
    System.out.println(nodeName+" UP: "+upname1); 

    if(upname1.equals(nodeName)) 
    { 
      NodeList pvalList = eElement.getElementsByTagName("paramvalues"); 
      for(int l=0; l< pvalList.getLength(); l++) 
      { 
       Node pNode = (Node) pvalList.item(l); 
       NodeList valList = pNode.getChildNodes(); 

       for(int j=0; j<valList.getLength(); j++) 
       { 
        Node valNode = (Node) valList.item(j); 

        if(valNode.getNodeName().equals("value")) 
        { 
          NamedNodeMap att = valNode.getAttributes(); 

          for(int s=0; s<att.getLength(); s++) 
          { 
           Node n1 = att.item(s); 
           System.out.println("len: "+att.getLength()); 
           if(n1.getNodeName().equals("default")) 
            def = n1.getNodeValue(); 

           if(n1.getNodeName().equals("actualvalue")) 
            aval = n1.getNodeValue(); 
          } 
         } 
       } 
      } 
    } 
} 

Ich weiß das ein seltsames Problem, aber es wird irritierend, während ich meine Arbeit beende.

Plz helfen .. Danke ..

+2

Können Sie Ihren problematischen Java-Code zeigen? –

+1

Es ist wahrscheinlich, weil Ihr Code nicht überprüft, ob ein Knoten eine Instanz von 'Element' ist. Wahrscheinlich müssen Sie Textknoten herausfiltern. Es ist ziemlich einfach, aber Sie müssen etwas Code zeigen :) – laher

+0

1. versuchen Sie und 'normalize()' die XML-Daten vor dem Analysieren es. 2. Bitte fügen Sie etwas Code ein! –

Antwort

0

Sie könnten versuchen, nur eine Klasse zu machen Leerzeichen von links und rechts neben der Zeichenfolge TRIM, während das Dokument für Beispiel ‚John Smith‘ wird ‚John Parsen Smith ' | src: http://rosettacode.org/wiki/Strip_whitespace_from_a_string/Top_and_tail

public class Trims{ 
    public static String ltrim(String s){ 
     int i = 0; 
     while (i < s.length() && Character.isWhitespace(s.charAt(i))){ 
     i++; 
     } 
     return s.substring(i); 
    } 

    public static String rtrim(String s){ 
     int i = s.length() - 1; 
     while (i > 0 && Character.isWhitespace(s.charAt(i))){ 
     i--; 
     } 
     return s.substring(0, i + 1); 
    } 

    public static void main(String[] args){ 
     String s = " \t \r \n String with spaces \t \r \n "; 
     System.out.println(ltrim(s)); 
     System.out.println(rtrim(s)); 
     System.out.println(s.trim()); //trims both ends 
    } 

oder einen anderen Weg finden, mit dem Inhalt zu tun .. nutzen DOMBuilder (http://www.java-tips.org/other-api-tips/jdom/dealing-with-mixed-content-whitespace-comments-text-child-elements-and.html)

 // a builder takes a boolean value meaning validation mode: 
     DOMBuilder builder = new DOMBuilder(false); 

     // simply load the document:: 
     Document document = builder.build(
       new java.io.File("sample.xml")); 

     Element order = document.getRootElement(); 

     // find an address tag: 
     Element address = 
       order.getChild("purchased-by").getChild("address"); 
Verwandte Themen