Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将XML文档复制到字符串变量中_Java_Xml_String_Xml Parsing - Fatal编程技术网

在Java中将XML文档复制到字符串变量中

在Java中将XML文档复制到字符串变量中,java,xml,string,xml-parsing,Java,Xml,String,Xml Parsing,我试图将整个XML文档标记名/标记类型复制到字符串变量中。要使用的语言是Java。我使用ReadAllText在C#中实现了这一点,但我需要在Java中找到一个与该命令等效的命令或其他方法,以便能够将整个XML文档作为字符串。我已经为此工作了一段时间了。这是一个更大项目的一部分。这是唯一要做的事情。有什么建议吗? 提前感谢。请尝试以下代码: public String convertXMLFileToString(String fileName) { try { D

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

请尝试以下代码:

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

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

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

StringWriter
StreamResult
一起使用


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

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

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

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

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

  • 如果使用BufferedInputStream并读取行,则结果是缺少换行符
  • 如果使用BufferedReader或扫描仪并读取行,则结果是缺少原始行中断,编码可能错误
  • 如果在结果中使用写入程序,则编码可能与源不匹配
如果您确实了解源代码编码,则可以执行以下操作:

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

@肖恩:+1,完美复制。别忘了对答案给出反馈,并选择一个最好的答案。非常感谢。不过我想出来了!我感谢你的帮助。如果你喜欢这个答案,那么你应该选择它作为最佳答案……我知道你是新来的,所以我只是想告诉你一些礼节。非常感谢。不过我想出来了!我感谢你的帮助。但这是另一种方式。学习新东西总是很愉快的!请记住,BufferedReader将吃掉每行末尾的\n。这是我的最终目标。我使用XStream作为一个序列化程序,它会阻塞新行字符。最终,我不想在任何版本的代码中使用这些字符,因为我试图忽略XML的纯文本可读性,并使用一些XML友好的查看器。嘿,你知道如何将特定的标记内容复制到字符串中吗?在我的个人资料中还有一个问题,其中有详细信息。如果你能帮助我,我真的会非常感谢你,因为你看起来是一个很好的程序员!谢谢