用document将文件写到xml两个标签之间 用FileReader加上BufferedReader试一试用BufferedReader的readLine() 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼上的朋友,我试过了,由于document没有提供write buffer[]的接口,我只能将用Bufferreader读到的数据先转化我字符串形式再赋给nodevalue;但这样写进去的字母仍然是字母形式,而汉字变为乱码并且再把它读成文件的时候,我用的是bufferwriter.write();这个方法一次最多只能写16K的东西,我是把一个字符串赋给bufferwriter.write()方法写的,由于串大,写不完整郁闷!有没有将串读到缓冲的方法啊,请帮忙! 我要把一些记录条目打包为xml文件,比如一本书,它包括:书名,作者,出版单位,出版日期,价格等,这些东西可以用document很轻松的打进去,现在碰到的问题就是如何把书的内容打包进去,书的内容可能包括文本,图片,还有音频视频等,就是说如何把这些文本,图片,音频,视频等文件打包进去,不能用链接,要把实际的内容打包进去,我用的是document,到现在找不到办法,楼上的朋友清楚了没?谢谢帮忙! xml中传输2进制文件一般要经过base64编码,因此是有效率损失的,因此你需要根据你的数据量全面评估。另外,即使创建xml文档也没必要用DOM创建,应该直接写字符串标签。以提高效率。你不会要用xml传输一个电影吧。:) 说实在的如果可以的话,现在做的这个东西最好能再xml里包装一个比较大的多媒体文件;现在就是要把多媒体文件打包到xml文件中;目前位置已经可以写小文件了,我使用dom写标签,然后用流将文件读成串经过base64编码赋给一个标签做为其内容,不过遗憾的是只能打包比较小的多媒体文件,如果大了就很难解析,因为在java中用dom解析xml时,不想在.net中有专门的xmltextreader()方法可以读取xml文件中的任何字段;在java中只能将一个标签值以串的形式一次读出,但如果多媒体文件太大,则这个串也太长,在虚拟机内容受限的情况下,无法缓冲这个超长串而导致内存溢出!如果能找到一个可以将串一段一段读取的方法就好了!但stringreader是不行的,它在读取时也要将整个串传给它,还是要去整个串的内容,必然也会溢出!希望大家讨论讨论!谢谢usabcd! 谢谢各位的支持!我写了一个用xsd文件验证xml文件格式的方法,如下:/** * 使用xsd验证xml * @param xmlfilename String xml文件 包括路径 * @param xsdfilename String xsd文件 包括路径 * @param validatesuccess boolean 是否验证成功 成功返回true, * @return boolean 成功返回true 失败返回false */ public boolean validatexmlbyxsd(String xmlfilename,String xsdfilename,boolean validatesuccess){ File xmlfile=new File(xmlfilename); File xsdfile=new File(xsdfilename); //检测原文件和验证文件是否存在 if(!((xmlfile.exists())&&(xsdfile.exists()))) return false; final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; SAXParserFactory factory=SAXParserFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(true); try{ SAXParser parser=factory.newSAXParser(); parser.setProperty(SCHEMA_SOURCE,xsdfile); parser.setProperty(SCHEMA_LANGUAGE,XML_SCHEMA); //parser.setProperty(SCHEMA_SOURCE,xsdfile); parser.parse(xmlfile,new DefaultHandler()); validatesuccess=true; }catch(SAXNotRecognizedException ex){ System.err.println("未知的属性异常:"+ex.getMessage()); validatesuccess=false; }catch(SAXNotSupportedException ex){ System.err.println("不支持的属性:"+ex.getMessage()); validatesuccess=false; }catch(ParserConfigurationException ex){ System.err.println("您的解析器不是jaxp 1.2所支持的"+ex.getMessage()); validatesuccess=false; }catch(SAXException ex){ System.err.println("您的解析器不是jaxp 1.2所支持的"+ex.getMessage()); validatesuccess=false; }catch(IOException ex){ System.err.println(""+ex.getMessage()); validatesuccess=false; }catch(Exception ex){ System.err.println(ex.getMessage()); validatesuccess=false; } return validatesuccess; }但好像这个方法不起作用,即使格式明显不对,也会返回true!希望各位帮忙看看,给点意见,谢谢! Base64编码处理。想一想邮件的内容是如何处理的。 如果你的文件大于数兆,那么,肯定要将效率摆到首位,根本就不能这样做了。必须直接传2进制文件。 xml中仅放入一个文件链接。另,schema 的验证不是这样用的,要用xml reader 并且必须指定一个ErrorHandler SAXParser parser = factory.newSAXParser(); parser.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA); parser.setProperty(SCHEMA_SOURCE, xsdfile); XMLReader xmlReader = parser.getXMLReader(); xmlReader.setContentHandler(new DefaultHandler()); xmlReader.setErrorHandler(new MyErrorHandler(System.out)); xmlReader.parse("file:/D:/test/xml/test.xml"); 谢谢usabcd!你说的一点也不错,如果将多媒体内容直接打包进xml文件(文件内容以base64)编码保存,再写入时没问题,但解析时,我用的是document解析,必须将xml中base64格式的多媒体 内容导出成一个string,但java虚拟机的内存是有限的,这个string太大,导致内存溢出!我测试过,如果多媒体源文件大于5M,则打包后的xml文件久会达到7、8M,解析时会内存溢出!我正在做xml的验证,我试了一下xmlreader,的确应该这样做!但严重时出现一个问题,不得其解,希望不吝赐教!xml的头是这样写的:<?xml version="1.0" encoding="UTF-8" ?> - <!-- 电子文件--> - <WJGL xmlns="http://www.titans.com/PYXmlWJ.xsd">xsd文件头是这样写的:<?xml version="1.0" encoding="UTF-8"?><xsd:schema id="WJGL" targetNamespace="http://www.titans.com/PYXmlWJ.xsd" elementFormDefault="qualified" attributeFormDefault="qualified" xmlns="http://www.titans.com/PYXmlWJ.xsd"xmlns:xsd="http://www.w3.org/2001/XMLSchema">验证时总是出现一个错误:src-resolve.4.2: Components from namespace 'http://www.w3.org/2001/XMLSchema' are not referenceable from schema document 'null'.这是什么问题啊? 不清楚,你把xml和xsd贴完整看看(可以自己稍微简化一下)。 那个验证是因为在xsd代码中有些类型定义写错导致的,现在不过在验证程序中,必须有这句: xmlReader.setErrorHandler(new MyErrorHandler(System.out));但时其中那个errorhandler必须自己定义个类才能实现,这样我写的代码就又多了一个类,并且这个类的继承errorhandler类,可我想把我写的代码都归结到一个类中,有没有不用重建类就可以实现errorhandler的方法???但又不能直接new一个,因为系统中那个是抽象类???小弟在这里还有一个文件加密的帖子,希望各位又兴趣的去看看! errorhandler是个接口,你就在这个类里面写一个class实现它,又不麻烦。如果你实在不想写,网上满世界都是。自己去抄一个。 谢谢各位的帮忙,特别是usabcd,有兴趣的话去看看有关文件加密的帖子哦!!我们共同研究!!! 二进制数据会遇xml的encoding有冲突最好是用base64编码后加入或者用<![CDATA[ .. ]]> cteng,有没有用<!CDATA[]>操作的详细的方法?我用的是base64,但在读取时由于文件内容在xml标签直径以base64编码方式保存的,只能以字符的形式读取,但这个串如果太大,则就是访问这个串都很困难,内存的有限性根本不允许这样做!有没有更好的解决方法,除了上面usabcd说的保存文件路径的方法!我把文件保存到xml中主要是为了存储方便,而不是为了传输!有没有更好的解决办法啊! 求个无刷新投票~~ 用递归算法实现费博那契数列的问题 请问怎样划分简单的JAVABEAN? 100分求解~~~ java子类调用父类的构造函数 初学ejb,大家看我理解得咋样?还有几个小问题,请大家帮忙解决一下,up有分! 用JDOM8增加XML文件的属性时提示找不到方法addAttribute怎么办?急!!!! jbuilder7里更改xml配置文件后怎么没有了? 关于ejb打包的一点疑问??------------过来人帮忙!!:) 字符串分割成数组,这个好像不好弄.. 令我困惑的的问题(JSP),求教! 关于sql server 2000数据库的服务器?
并且再把它读成文件的时候,我用的是bufferwriter.write();这个方法一次最多只能写16K的东西,我是把一个字符串赋给bufferwriter.write()方法写的,由于串大,写不完整
郁闷!
有没有将串读到缓冲的方法啊,请帮忙!
谢谢帮忙!
你不会要用xml传输一个电影吧。:)
谢谢usabcd!
* 使用xsd验证xml
* @param xmlfilename String xml文件 包括路径
* @param xsdfilename String xsd文件 包括路径
* @param validatesuccess boolean 是否验证成功 成功返回true,
* @return boolean 成功返回true 失败返回false
*/
public boolean validatexmlbyxsd(String xmlfilename,String xsdfilename,boolean validatesuccess){ File xmlfile=new File(xmlfilename);
File xsdfile=new File(xsdfilename);
//检测原文件和验证文件是否存在
if(!((xmlfile.exists())&&(xsdfile.exists())))
return false;
final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; SAXParserFactory factory=SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true); try{
SAXParser parser=factory.newSAXParser();
parser.setProperty(SCHEMA_SOURCE,xsdfile);
parser.setProperty(SCHEMA_LANGUAGE,XML_SCHEMA);
//parser.setProperty(SCHEMA_SOURCE,xsdfile);
parser.parse(xmlfile,new DefaultHandler());
validatesuccess=true;
}catch(SAXNotRecognizedException ex){
System.err.println("未知的属性异常:"+ex.getMessage());
validatesuccess=false;
}catch(SAXNotSupportedException ex){
System.err.println("不支持的属性:"+ex.getMessage());
validatesuccess=false;
}catch(ParserConfigurationException ex){
System.err.println("您的解析器不是jaxp 1.2所支持的"+ex.getMessage());
validatesuccess=false;
}catch(SAXException ex){
System.err.println("您的解析器不是jaxp 1.2所支持的"+ex.getMessage());
validatesuccess=false;
}catch(IOException ex){
System.err.println(""+ex.getMessage());
validatesuccess=false;
}catch(Exception ex){
System.err.println(ex.getMessage());
validatesuccess=false;
}
return validatesuccess;
}但好像这个方法不起作用,即使格式明显不对,也会返回true!希望各位帮忙看看,给点意见,谢谢!
想一想邮件的内容是如何处理的。
parser.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA);
parser.setProperty(SCHEMA_SOURCE, xsdfile); XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(new DefaultHandler());
xmlReader.setErrorHandler(new MyErrorHandler(System.out));
xmlReader.parse("file:/D:/test/xml/test.xml");
我测试过,如果多媒体源文件大于5M,则打包后的xml文件久会达到7、8M,解析时会内存溢出!我正在做xml的验证,我试了一下xmlreader,的确应该这样做!但严重时出现一个问题,不得其解,希望不吝赐教!
xml的头是这样写的
:<?xml version="1.0" encoding="UTF-8" ?>
- <!-- 电子文件-->
- <WJGL xmlns="http://www.titans.com/PYXmlWJ.xsd">
xsd文件头是这样写的:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema id="WJGL" targetNamespace="http://www.titans.com/PYXmlWJ.xsd" elementFormDefault="qualified"
attributeFormDefault="qualified" xmlns="http://www.titans.com/PYXmlWJ.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
验证时总是出现一个错误:src-resolve.4.2: Components from namespace 'http://www.w3.org/2001/XMLSchema' are not referenceable from schema document 'null'.
这是什么问题啊?
小弟在这里还有一个文件加密的帖子,希望各位又兴趣的去看看!
如果你实在不想写,网上满世界都是。自己去抄一个。
我们共同研究!!!
最好是用base64编码后加入
或者用<![CDATA[ .. ]]>