2014-04-18 8 views
5
<node> test 
    test 
    test 
</node> 

chcę mój parsera XML odczytać znaki <node> oraz:Usuwanie duplikatów nowe linie/tabs/białe znaki w postaci elementu XML

  1. zastąpić newlines i spacje i komponować wielokrotne spacje w jedną. W rezultacie tekst powinien wyglądać podobnie do "testu testu testowego".
  2. Jeśli węzeł zawiera znaki zakodowane w XML: tabulatory (&#x9;), znaki nowej linii (&#xA;) lub białe znaki (&#20;) - należy je pozostawić.

Próbuję kod poniżej, ale zachowuje duplikaty białych znaków.

dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setIgnoringComments(true); 
    dbf.setNamespaceAware(namespaceAware); 
    db = dbf.newDocumentBuilder(); 
    doc = db.parse(inputStream); 

Czy jest jakiś sposób, aby zrobić to, co chcę?

Dzięki!

+0

spróbuj dodać ten wiersz 'dbf.setIgnoringElementContentWhitespace (true);' – deanosaur

+0

Niestety, to nie działa. Ta właściwość kontroluje sposób postępowania z białymi przestrzeniami w elementach innych niż tekstowe – dbahdano

Odpowiedz

1

Pierwsza część - zastąpienie wielu white-space - jest stosunkowo proste, choć nie sądzę, parser zrobi to za ciebie:

InputSource stream = new InputSource(inputStream); 
XPath xpath = XPathFactory.newInstance().newXPath(); 
Document doc = (Document) xpath.evaluate("/", stream, XPathConstants.NODE); 

NodeList nodes = (NodeList) xpath.evaluate("//text()", doc, 
    XPathConstants.NODESET); 
for (int i = 0; i < nodes.getLength(); i++) { 
    Text text = (Text) nodes.item(i); 
    text.setTextContent(text.getTextContent().replaceAll("\\s{2,}", " ")); 
} 

// check results 
TransformerFactory.newInstance() 
    .newTransformer() 
    .transform(new DOMSource(doc), new StreamResult(System.out)); 

Jest to najtrudniejsza część:

Jeśli węzeł zawiera znaki zakodowane w XML: tabulatory (&#x9;), znaki nowej linii (&#xA;) lub białe znaki (&#20;) - należy je pozostawić.

Parser zawsze włączyć "&#x9;" do "\t" - może trzeba napisać własne parsera XML.

According to autor Saxon:

Nie sądzę, każdy parser zgłosi numeryczne cechy charakteru do wniosku - zawsze będą rozszerzone. Naprawdę, twoja aplikacja nie powinna przejmować się tym bardziej, niż dba o to, ile jest odstępów między atrybutami.

Powiązane problemy