1

既存の構成XMLファイルのいくつかのノードを変更しています<!DOCTYPE>。行が含まれています。

Xquery式を使用してXMLファイルを変更した後、結果のXMLファイルには、 <!DOCTYPE>行を除くすべてのデータが元のデータとして含まれます。

したがって、<!DOCTYPE>結果のXMLファイルにも行が必要です。

私のソースXMLファイル:<!DOCTYPE>行付き

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="c3p0.autoCommitOnClose">false</property>
        <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

結果のXMLファイル:<!DOCTYPE>行がありませんが、必要です

<?xml version="1.0" encoding="UTF-8" standalone="no"?><hibernate-configuration>
    <session-factory>
        <property name="c3p0.autoCommitOnClose">false</property>
        <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

読み取りと書き込みの論理コードは次のとおりです。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        DocumentBuilder builder;
        Document doc = null;
        XPathExpression expr = null;
        Node attributeElement = null;
        try {

            builder = factory.newDocumentBuilder();
            // creating input stream
            doc = builder.parse(file);
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xpath = xpf.newXPath();

            //expr = xpath.compile("/sitemesh/mapping/@decorator");
            expr = xpath.compile("/hibernate-configuration/session-factory/property/@name='connection.url'");
            attributeElement = (Node) expr.evaluate(doc, XPathConstants.NODE);
            System.out.println("value:"+attributeElement.getNodeValue());

            //attributeElement.setNodeValue("/WEB-INF/views/decorators/" + themeName);

        } catch (Exception e) {
            System.out.println("e:"+e);
        }


        // writing xml file
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer;
        try {
            transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(file);// creating output
                                                            // stream
            transformer.transform(source, result);
        } catch (Exception e) {
        }

XMLファイルの一部のノードを変更した直後、結果のファイルに<!DOCTYPE> 行が含まれていません

<!doctype>結果のxmlに行を追加する方法を教えてください。ありがとう

4

2 に答える 2

1

私は答えを得ました。編集後にファイルを書き込んでいる間...

transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
                            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd");
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(file);// creating output
                                                            // stream
            transformer.transform(source, result);

setOutPutProperty.... を好きなように設定するだけです

ありがとうございました

于 2013-08-30T07:31:46.800 に答える
0

DOCTYPEステートメントをハードコーディングする代わりに、文字列変数を使用します。これは、コード内の緩い結合を維持するのに役立ちます。

String doctype="http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd";
transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,doctype);
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file);// creating output stream                                                    
transformer.transform(source, result);

このようなDoctypeが多数必要な場合は、プロパティファイルでも管理できます。将来必要に応じて簡単に変更できるように。

于 2013-09-02T05:32:45.887 に答える