Копирование XML-документа в строковую переменную в Java - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь скопировать весь XML-документ, теги / типы тегов которого не имеют значения, в переменную String. Используемый язык - Java. Я использовал ReadAllText, чтобы сделать это в C #, но мне нужно найти эквивалент этой команды в Java или другую идею, чтобы иметь возможность иметь весь XML-документ в виде строки. Я работал над этим некоторое время сейчас. Это часть большого проекта. Это единственное, что осталось сделать. Какие-либо предложения? Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 16 августа 2011

Ну, так как это Java, а не язык сценариев, вам просто нужно использовать сканер или средство чтения файлов, читать его построчно и добавлять в одну строку.

Этот сайт имеет отличный обзор файла io в java. Я действительно многому научился, даже зная о файле IO.

Вот пример того, что вы могли бы сделать:

private void processFile(File file)
{
        StringBuilder allText = new StringBuilder();
        String line;
        Scanner reader = null;
        try {
            FileInputStream fis = new FileInputStream(propertyFile);
            InputStreamReader in = new InputStreamReader(fis, "ISO-8859-1");
            reader = new Scanner(in);
            while(reader.hasNextLine() && !errorState)
            {
                line = reader.nextLine();
                allText.append(line);
            }
        } catch (FileNotFoundException e)
        {
            System.err.println("Unable to read file");
            errorState=true;
        } catch (UnsupportedEncodingException e) {
            System.err.println("Encoding not supported");
            errorState=true;
        }
        finally
        {
            reader.close();
        }
}
0 голосов
/ 17 августа 2011

Многие ответы, которые получают это почти, но не совсем, правильно.

  • Если вы используете BufferedInputStream и читаете строки, в результате пропускаются разрывы строк
  • Если вы используете BufferedReader или Сканер и читаете строки, в результате отсутствуют исходные разрывы строк и может быть неправильная кодировка.
  • Если вы используете Writer в Result, кодировка может не соответствовать источнику

Если вы точно знаете кодировку источника, вы можете сделать это:

String file2string(File f, Charset cs) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream(10000);
    InputStream in = new BufferedInputStream(new FileInputStream(f));
    int c;
    while ((c = in.read()) != -1)
        out.write(c);
    in.close();
    return out.toString(cs.name());
}

Если вы не знаете исходную кодировку, положитесь на анализатор XML, чтобы обнаружить его и управлять выводом:

String transform2String(File f, Charset cs) throws IOException,
        TransformerFactoryConfigurationError, TransformerException {
    Transformer t = TransformerFactory.newInstance().newTransformer();
    t.setOutputProperty(OutputKeys.ENCODING, cs.name());
    ByteArrayOutputStream out = new ByteArrayOutputStream(10000);
    t.transform(new StreamSource(new BufferedInputStream(
            new FileInputStream(f))), new StreamResult(out));
    return out.toString(cs.name());
}
0 голосов
/ 16 августа 2011

В прошлый раз я использовал буферизованный Reader.Работало хорошо.

String output = "";
try {
  FileInputStream is = new FileInputStream(file);
  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  String line = "";
  while ((line = br.readLine()) != null) {
    output = output + line;
  }
  br.close();
  is.close();
} catch(IOException ex) {
  //LOG!
}

Моя первоначальная реализация состояла в том, чтобы использовать реальный буфер, но у меня, похоже, были проблемы с очисткой буфера, поэтому я пошел по этому пути, что очень просто.

0 голосов
/ 16 августа 2011

используйте StringWriter с примечанием StreamResult.

, будьте очень осторожны с тем, что вы делаете с этой строкой после .если вы позже запишете его в какой-либо поток / байт [], используя неправильную кодировку символов, вы сгенерируете испорченные данные XML.

0 голосов
/ 16 августа 2011

Попробуйте следующий код:

public String convertXMLFileToString(String fileName) 
{ 
    try { 
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
        InputStream inputStream = new FileInputStream(new File(fileName)); 
        org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(inputStream); 
        StringWriter stw = new StringWriter(); 
        Transformer serializer = TransformerFactory.newInstance().newTransformer(); 
        serializer.transform(new DOMSource(doc), new StreamResult(stw)); 
        return stw.toString(); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
    return null; 
}
...