问题描述
|
Properties类具有非常好的方法storeToXml和loadFromXml。但是商店添加了标头,所以xml看起来像这样
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">
<properties>
<entry key=\"key\">value</entry>
</properties>
我不希望有此标头,因为我将其存储在数据库中以使其可插入xpath。我也想加载到Properties对象。有谁好主意吗?谢谢
解决方法
XPath和ѭ1都不关心标题。因此,这应该是可行的。
如果确实有问题,则将结果写入
StringWriter
或ByteArrayOutputStream
并删除<properties>
之前的所有内容。但这实际上可能会导致加载XML的错误,因为现在缺少doctype。
,尝试这种方式:
Properties p = new Properties();
p.put(\"A.a\",\"BB\");
p.put(\"A.b\",\"BB\");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
p.storeToXML(bout,\"Commnet!\");
String sp = new String(bout.toByteArray());
sp = sp.substring(sp.indexOf(\'\\n\',sp.indexOf(\'\\n\') + 1) + 1);
System.out.println(sp);
它会给您以下结果:
<properties>
<comment>COmmnet!</comment>
<entry key=\"A.b\">BB</entry>
<entry key=\"A.a\">BB</entry>
</properties>
,只需删除标题:
BufferedReader br = new BufferedReader(new FileReader(new File(\"filename\")));
BufferedWriter wr = new BufferedWriter(new FileWriter(new File(\"filename_out\")));
String line;
int counter = 0;
while((line=br.readLine())!= null){
if(counter > 0){
wr.write(line.trim());
}
counter++;
}
wr.close();
br.close();
,您可以使用删除文档类型声明的xslt转换此xml,然后将输出存储在数据库中。
public class XMLTransform {
public static void main(String args[]) {
try {
StreamSource source = new StreamSource(\"your xml\");
StreamSource stylesource = new StreamSource(\"your xslt\");
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(stylesource);
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,\"yes\");
StreamResult result = new StreamResult(new File(\"your xml output file\"));
transformer.transform(source,result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
,鉴于properties.dtd如此琐碎,请自己编写和解析XML。
输出:
private static String toXml(Properties props) throws XMLStreamException {
Writer buffer = new StringWriter();
XMLStreamWriter xml = XMLOutputFactory.newFactory()
.createXMLStreamWriter(buffer);
xml.writeStartElement(\"properties\");
for (Map.Entry<Object,Object> entry : props.entrySet()) {
xml.writeStartElement(\"entry\");
xml.writeAttribute(\"key\",entry.getKey()
.toString());
xml.writeCharacters(entry.getValue()
.toString());
xml.writeEndElement();
}
xml.writeEndElement();
return buffer.toString();
}
输入:
private static Properties fromXml(String xml) throws XPathException {
Properties props = new Properties();
NodeList entries =
(NodeList) XPathFactory.newInstance()
.newXPath()
.evaluate(\"//entry\",new InputSource(new StringReader(xml)),XPathConstants.NODESET);
for (int i = 0; i < entries.getLength(); i++) {
Node entry = entries.item(i);
props.setProperty(entry.getAttributes()
.getNamedItem(\"key\")
.getNodeValue(),entry.getTextContent());
}
return props;
}
我假设您想将数据作为默认的JDBC映射-字符串。