前一次些相关内容的时候,也有XML保存的描述。但是今天用的时候发现一个问题(所用XML模式见附录1):
File file = new File(filename);
UrlsDocument doc;
doc = UrlsDocument.Factory.newInstance();
UrlBeanType url = doc.addNewUrls().addNewUrl();
url.setUrlId(ub.getUrlId());
url.setUrlDepth(ub.getUrlDepth());
url.setUrlText(ub.getUrlText());
doc.save(file);
1. 如果每次都如上用doc = ***Document.Factory.newInstance();这样每次都新建了一个document,保存的时候恢复该原来的内容。解决方法是当文件文件不存在(或者内容为空)的时候采用如下方法:
File file = new File(filename);
UrlsDocument doc;
if(file.exists())
doc = UrlsDocument.Factory.parse(file);
else
doc = UrlsDocument.Factory.newInstance();
UrlBeanType url = doc.addNewUrls().addNewUrl();
url.setUrlId(ub.getUrlId());
url.setUrlDepth(ub.getUrlDepth());
url.setUrlText(ub.getUrlText());
doc.save(file);
2. 上面的问题解决了,又出来新的。当往文件中保存了一个url时,文件格式正确。但是当再添加一个url时,root node 出现了一个<xml-fragment> 匿名容器。而原来的<urls>根节点变成它的字节点。不知道为什么?结果是把原来XML模式改变,再parse的时候就出错了。解决办法:
File urlFile = new File(fn);
UrlBeanType url;
UrlsDocument doc;
UrlsDocument.Urls urls;
if(urlFile.exists())
{
doc = UrlsDocument.Factory.parse(urlFile);
urls = doc.getUrls();
url = urls.addNewUrl();
}
else
{
doc = UrlsDocument.Factory.newInstance();
url = doc.addNewUrls().addNewUrl();
}
url.setUrlId(ub.getUrlId());
url.setUrlDepth(ub.getUrlDepth());
url.setUrlText(ub.getUrlText());
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setSavePrettyPrint(); // 是文件中的格式美观
doc.save(urlFile, xmlOptions);
附录1
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="urls">
<xs:complexType>
<xs:sequence>
<xs:element name="url" type="urlBeanType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="urlBeanType">
<xs:sequence>
<xs:element name="url_id" type="xs:string"/>
<xs:element name="url_depth" type="xs:int"/>
<xs:element name="url_text" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>