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

Java 将属性保存为不带标题的XML,java,xml,properties,Java,Xml,Properties,Properties类有非常好的方法storeToXml和loadFromXml。但store添加了头,所以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类有非常好的方法storeToXml和loadFromXml。但store添加了头,所以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进行检索。我还想加载到属性对象。有什么好主意吗?谢谢

只需删除标题:

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

XPath和
Properties.loadFromXml()
都不关心头。所以这应该是可行的


如果确实存在问题,则将结果写入
StringWriter
ByteArrayOutputStream
并删除
之前的任何内容。但这实际上可能会导致加载XML时出错,因为doctype现在已丢失。

您可以使用xslt转换此XML,删除doctype声明并将输出存储在数据库中

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

通讯网!
BB
BB
考虑到这一点非常简单,请自己编写和解析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();
  }
私有静态字符串toXml(Properties props)抛出XMLStreamException{
编写器缓冲区=新的StringWriter();
XMLStreamWriter xml=XMLOutputFactory.newFactory()
.createXMLStreamWriter(缓冲区);
writeStarteElement(“属性”);
for(Map.Entry:props.entrySet()){
writeStarteElement(“条目”);
writeAttribute(“key”,entry.getKey()
.toString());
writeCharacters(entry.getValue()
.toString());
writeEndElement();
}
writeEndElement();
返回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;
  }
private静态属性fromXml(字符串xml)抛出XPathException{
Properties props=新属性();
节点列表条目=
(NodeList)XPathFactory.newInstance()
.newXPath()
.evaluate(“//entry”,新的InputSource(新的StringReader(xml)),
XPathConstants.NODESET);
对于(int i=0;i

我假设您希望数据作为默认的JDBC映射-字符串。

头不会影响xpath,因为它只是元数据。但是sqlserver说不允许使用内部子集DTD解析XML。使用CONVERT with style option 2来启用有限的内部子集DTD支持。谢谢大家,我真的需要使用sql server的CONVERT功能,它会删除DTD和标头,当我加载它时,它正确地转换为属性。然后,当加载回属性时,我需要重新添加头?此代码假设实现细节-XML中有换行符。代码中还存在一个编码错误,它(错误地)假定默认系统编码用于写入数据。此代码假定实现细节—XML中存在换行符。此方法的缺点是将数据写入XML,然后对其进行解析,然后再次写入。这会起作用,但可能会影响性能。此外,还需要执行其他操作来删除DTD声明(例如,使用XSLT模板或StAX筛选结果)。诚然,他必须编写XSLT模板来删除DTD声明,正如我上面所述,但我认为他必须将xml文件输出存储在xml数据库中(例如,eXist db)通过这种方法,他可以将文件直接存储在db子目录下,避免了在任何情况下他都应该做的一段。变压器和变压器也可能会有问题<代码>属性。storeToXML
将保留类似
\r
的字符。我应该注意,我的实现中存在一个弱点—它不会保留空白—这可以通过键值对来演示:
“\r”
=
”\r”
。根据,换行符转换为
\n