2009-12-30 2 views
1

Загрузите xml-файл в DOM-модель и проанализируйте ее.Прочтите скрытую цитату как скрытую цитату из xml

Код, который:

public class MyTest { 
public static void main(String[] args) {   
    Document doc = XMLUtils.fileToDom("MyTest.xml");//Loads xml data to DOM 
    Element rootElement = doc.getDocumentElement(); 
    NodeList nodes = rootElement.getChildNodes(); 
    Node child1 = nodes.item(1); 
    Node child2 = nodes.item(3); 
    String str1 = child1.getTextContent(); 
    String str2 = child2.getTextContent();  
    if(str1 != null){ 
     System.out.println(str1.equals(str2)); 
    } 
    System.out.println(); 
    System.out.println(str1); 
    System.out.println(str2); 
} 

}

MyTest.xml

<tests> 
    <test name="1">ff1 &quot;</test> 
    <test name="2">ff1 "</test> 
</tests> 

Результат:

true 

ff1 " 
ff1 " 

Желаемый результат:

false 

ff1 &quot; 
ff1 " 

Поэтому мне нужно различать эти два случая: когда цитата сбежала, а ее нет.

Пожалуйста, помогите.

Заранее спасибо.

P.S. Код для XMLUtils # fileToDom (String Filepath), отрывок из класса XMLUtils:

static { 
    DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); 
    dFactory.setNamespaceAware(false); 
    dFactory.setValidating(false); 
    try { 
     docNonValidatingBuilder = dFactory.newDocumentBuilder(); 
    } catch (ParserConfigurationException e) { 
    } 
} 

public static DocumentBuilder getNonValidatingBuilder() { 
    return docNonValidatingBuilder; 
} 

public static Document fileToDom(String filePath) { 

    Document doc = getNonValidatingBuilder().newDocument(); 
    File f = new File(filePath); 
    if(!f.exists()) 
     return doc; 

    try { 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     DOMResult result = new DOMResult(doc); 
     StreamSource source = new StreamSource(f); 
     transformer.transform(source, result); 
    } catch (Exception e) { 
     return doc; 
    } 

    return doc; 

} 
+1

Если вы не возражаете, зачем вам это нужно? Этот '' 'был закодирован только для соответствия вашему XML-документу и не принадлежит к вашим исходным данным (будет' & quot; ') –

+0

http://stackoverflow.com/questions/1777878/is-there-a-java- xml-api-that-can-parse-a-document-without-resolving-character-ent/1778304 # 1778304 может быть полезен – skaffman

ответ

1

Я смотрю на исходный код apache xerces и предлагаю свое решение (но это патч обезьяны). Я написал простой класс

package a; 
import java.io.IOException; 
import org.apache.xerces.impl.XMLDocumentScannerImpl; 
import org.apache.xerces.parsers.NonValidatingConfiguration; 
import org.apache.xerces.xni.XMLString; 
import org.apache.xerces.xni.XNIException; 
import org.apache.xerces.xni.parser.XMLComponent; 

public class MyConfig extends NonValidatingConfiguration { 

    private MyScanner myScanner; 

    @Override 
    @SuppressWarnings("unchecked") 
    protected void configurePipeline() { 
     if (myScanner == null) { 
      myScanner = new MyScanner(); 
      addComponent((XMLComponent) myScanner); 
     } 
     super.fProperties.put(DOCUMENT_SCANNER, myScanner); 
     super.fScanner = myScanner; 
     super.fScanner.setDocumentHandler(this.fDocumentHandler); 
     super.fLastComponent = fScanner; 
    } 

    private static class MyScanner extends XMLDocumentScannerImpl { 

     @Override 
     protected void scanEntityReference() throws IOException, XNIException { 
      // name 
      String name = super.fEntityScanner.scanName(); 
      if (name == null) { 
       reportFatalError("NameRequiredInReference", null); 
       return; 
      } 

      super.fDocumentHandler.characters(new XMLString(("&" + name + ";") 
       .toCharArray(), 0, name.length() + 2), null); 

      // end 
      if (!super.fEntityScanner.skipChar(';')) { 
       reportFatalError("SemicolonRequiredInReference", 
         new Object[] { name }); 
      } 
      fMarkupDepth--; 
     } 
    } 

} 

Вам нужно только добавить следующую строку в ваш основной метод, прежде чем начать разбор

System.setProperty(
      "org.apache.xerces.xni.parser.XMLParserConfiguration", 
      "a.MyConfig"); 

И вы будете иметь ожидаемый результат:

false 

ff1 &quot; 
ff1 " 
0

Похоже, вы можете получить TEXT_NODE ребенка и использовать getNodeValue (при условии, что это не NULL):

public static String getRawContent(Node n) { 
    if (n == null) { 
     return null; 
    } 

    Node n1 = getChild(n, Node.TEXT_NODE); 

    if (n1 == null) { 
     return null; 
    } 

    return n1.getNodeValue(); 
} 

Схватил что от: http://www.java2s.com/Code/Java/XML/Gettherawtextcontentofanodeornullifthereisnotext.htm

+0

Нет, это не принесет вам ничего другого. Я не знаю, что автор это означает «сырой», но это не так. – bmargulies

0

Нельзя сделать это для внутренних объектов. XML не поддерживает эту концепцию. Внутренние объекты - это всего лишь другой способ записи одного и того же содержимого PSVI в текст, они не являются отличительными.