将属性保存为不带标题的XML

问题描述

| 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映射-字符串。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...