Как удалить новые строки, введенные при преобразовании документа в строку? - PullRequest
1 голос
/ 05 марта 2010

Я преобразую строку XML в список узлов, используя код,

InputSource inputSource = new InputSource(new ByteArrayInputStream(
    uploadFormBean.getXhtmlResponse().getBytes()));
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document;
document = documentBuilderFactory.newDocumentBuilder().parse(inputSource);

Я делаю вышеуказанный порядок, чтобы перебрать список узлов и заменить элементы одного узла, используя setTextContent.

Затем я преобразовываю документ в строку, используя приведенный ниже API,

 ByteArrayOutputStream byteOutput = new java.io.ByteArrayOutputStream();
 Result result = new StreamResult(byteOutput); 
 Source source = new DOMSource(document); 
 // write the DOM document to the file 
 Transformer transformer;
 transformer = TransformerFactory.newInstance().newTransformer();
 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "YES");
 transformer.transform(source, result);
 String resultText = byteOutput.toString();
 System.out.println("resultText::" + resultText);

Когда я отображаю строку, я обнаружил, что в результате в xml появились новые строки.

Почему это происходит? Исходная строка XML не имеет этих новых строк. Как это можно решить?

Когда я использую str.replaceAll ("(\ r | \ n)", ""); удаляет все новые строки. Я не хочу, чтобы это произошло. Я хочу вернуть строку так же, как ввод. Я ищу способ избежать ненужных новых строк, введенных в обработку.

Ответы [ 6 ]

0 голосов
/ 13 декабря 2012

Если вы используете реализацию xerces для вашей DOM, при сериализации убедитесь, что для флага indent установлено значение false.

org.apache.xml.serialize.OutputFormat format = 
new org.apache.xml.serialize.OutputFormat(n.getOwnerDocument());
format.setIndenting(true);
format.setPreserveSpace(false);
format.setLineWidth(80);
format.setMethod(Method.XML);

Варун Джангиди

0 голосов
/ 08 декабря 2011

Могу ли я предложить вам класс FilteredWriter:

private class FilteredWriter extends FilterWriter
{
    protected char[] filter = null;

    protected FilteredWriter(Writer out) {
        super(out);
    }

    public void setFilter(String filteredChars) {
        filter = filteredChars.toCharArray();
    }

    public void write(String str, int off, int len) throws IOException
    {
        write(str.toCharArray(), off, len);
    }

    public void write(char[] cbuf, int off, int len) throws IOException
    {
        for (int i = off; i < off + len; i++)
            write(cbuf[i]);
    }

    public void write(int c) throws IOException
    {
        for (char f : filter)
        {
            if (f == (char)c)
                return;
        }
        out.write(c);
    }
}

А вот как это использовать:

FilteredWriter filteredWriter = new FilteredWriter(writer);
filteredWriter.setFilter("\r\n\t");
StreamResult result = new StreamResult(filteredWriter);

Надеюсь, это поможет ...

0 голосов
/ 05 марта 2010

То есть, вы хотите, чтобы весь выходной XML был в одной строке?
Если это так, то это может подвох:

String separator = System.getProperty("line.separator");  
System.setProperty("line.separator", "");
transformer.transform(source, result);
// Remember to re-set it to it's original value!
System.setProperty("line.separator", separator);
0 голосов
/ 05 марта 2010

Получив объект DOM, попробуйте получить список узлов с помощью getChildNodes (). Затем выполните итерацию по всем дочерним узлам, используя item (), получая текстовое содержимое каждого узла с текстовым содержимым, а затем добавляя это содержимое в строку. Это может сработать для вас лучше, чем пытаться выяснить, что трансформатор делает с вашим документом.

0 голосов
/ 05 марта 2010

В JDK 1.6 я вставил следующий код, и он не добавляет никаких новых строк

InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("digest.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document = documentBuilderFactory.newDocumentBuilder().parse(resourceAsStream);
ByteArrayOutputStream byteOutput = new java.io.ByteArrayOutputStream();
Result result = new StreamResult(byteOutput); 
Source source = new DOMSource(document); 
// write the DOM document to the file 
Transformer transformer;
transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "YES");
transformer.transform(source, result);
String resultText = byteOutput.toString();
System.out.println("resultText::" + resultText);

Вы делаете что-то в вашем setTextContent? возможно, добавление новых строк в этот код непреднамеренно?

0 голосов
/ 05 марта 2010

transformer.setOutputProperty(OutputKeys.INDENT, "no"); может работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...