Сохранить свойства в XML без заголовка - PullRequest
1 голос
/ 26 мая 2011

Свойства класса имеют очень приятные методы 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.А также я хочу загрузить в объект Свойства.У кого-нибудь есть хорошие идеи?Спасибо

Ответы [ 5 ]

1 голос
/ 26 мая 2011

Попробуйте следующим образом:

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>
1 голос
/ 26 мая 2011

Ни XPath, ни Properties.loadFromXml() не заботятся о заголовке. Так что это должно работать как есть.

Если это действительно проблема, запишите результат в StringWriter или ByteArrayOutputStream и удалите что-либо до <properties>. Но это может привести к ошибкам при загрузке XML, так как теперь отсутствует тип документа.

1 голос
/ 26 мая 2011

Просто удалите заголовок:

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();
0 голосов
/ 26 мая 2011

Учитывая, что 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 по умолчанию - String.

0 голосов
/ 26 мая 2011

Вы можете преобразовать этот xml, используя xslt, который удаляет объявление 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();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...