【问题标题】:Copying an XML document into a String Variable in Java在 Java 中将 XML 文档复制到字符串变量中
【发布时间】:2011-10-28 08:16:44
【问题描述】:

我正在尝试将整个 XML 文档(标记名/标记类型无关)复制到字符串变量中。使用的语言是Java。我使用 ReadAllText 在 C# 中执行此操作,但我需要在 Java 中找到该命令的等效项或其他想法,以便能够将整个 XML 文档作为字符串。我已经为此工作了一段时间。这是一个更大项目的一部分。这是唯一需要做的事情。有什么建议? 提前致谢。

【问题讨论】:

标签: java xml string xml-parsing


【解决方案1】:

因为这是 java 而不是脚本语言,所以您只需要使用扫描仪或文件阅读器逐行读取并将其附加到单个字符串中。

This website 对 java 中的文件 io 有一个很好的概述。即使在了解了文件 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();
        }
}

【讨论】:

  • 非常感谢。不过我想通了!感谢您的帮助。
  • 如果您喜欢这个答案,那么您应该选择它作为最佳答案...我知道您是新手,所以我只是想告诉您一些 Stack Overflow 礼仪。
【解决方案2】:

试试下面的代码:

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; 
}

【讨论】:

  • 非常感谢。不过我想通了!我很感激帮助。这是一种不同的方式。学习新东西总是很高兴!
【解决方案3】:

使用StringWriterStreamResult

注意,之后要非常小心地处理该字符串。如果您稍后使用错误的字符编码将其写入某种流/字节[],您将生成损坏的 xml 数据。

【讨论】:

    【解决方案4】:

    我上次这样做时使用了缓冲阅读器。效果很好。

    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!
    }
    

    我最初的实现是使用一个实际的缓冲区,但我似乎一直在刷新缓冲区时遇到问题,所以我采用了这种方式,非常简单。

    【讨论】:

    • 请记住,BufferedReader 会吃掉每行末尾的 \n。
    • 这最终是我的目标。我使用 XStream 作为序列化程序,它会阻塞换行符。最终,我不想在任何版本的代码中使用这些字符,因为我试图忽略 XML 的纯文本可读性并使用一些 XML 友好的查看器。
    • 嘿,你知道如何将某些特定的标签内容复制到字符串中吗?我的个人资料上有另一个问题,其中包含详细信息。如果您能帮助我,我将非常感谢您,因为您看起来是个不错的编码员!谢谢!
    【解决方案5】:

    许多答案几乎是正确的,但并不完全正确。

    • 如果您使用 BufferedInputStream 并读取行,结果是缺少换行符
    • 如果您使用 BufferedReader 或 Scanner 并读取行,则结果会丢失原始换行符,并且编码可能是错误的。
    • 如果在 Result 中使用 Writer,编码可能与源不匹配

    如果你肯定知道源编码,你可以这样做:

    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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2015-08-06
      • 2011-07-24
      • 2011-02-03
      • 2016-05-09
      相关资源
      最近更新 更多