有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用Xpath Java修改XML中的属性值,包括注释部分

我的要求是将reloadable=“true”更新为reloadable=“false”。下面的代码做得很好,但没有更新注释部分中的属性。 我知道comment()函数可以,但到目前为止真的不走运,下面是代码

NodeList contextRoots = XMLUtil.xPathNodeList("//*[contains(@reloadable, 'true')]", ServerXML.getDocumentElement());
            for(int id = 0; id < contextRoots.getLength(); id++) 
            {
                Node value = contextRoots.item(id).getAttributes().getNamedItem("reloadable");
                String val = value.getNodeValue();
                value.setNodeValue(val.replaceAll("true", "false"));
            }
            return ServerXML;

下面是XML

    <Context docBase="/UserManager" path="" reloadable="true"/>
    <Context docBase="/UserManager" path="" reloadable="true"/>

    <Context docBase="/AdminConsole" path="" reloadable="true"/>
    <Context docBase="/AdminConsole" path="" reloadable="true"/>

    <Context docBase="/public#cert" path="" reloadable="true"/>
    <Context docBase="/public#cert" path="" reloadable="true"/>

    <!-- Remove below comment block if CQI is installed--> 
    <!-- <Context docBase="CQI" path="" reloadable="true" />
    <Context docBase="CQI" path="" reloadable="true" /> --> 

共 (1) 个答案

  1. # 1 楼答案

    您可以检测节点是否为^{},并查看其数据是否以<Context开头,并将reloadable=true替换为reloadable=false,如下代码所示:

     InputSource inputSource = new InputSource( new FileInputStream( new File("commentupdate.xml")  ) );
    
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse( inputSource );
    NodeList nodeList = doc.getDocumentElement().getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) 
    {
        if ( nodeList.item(i).getNodeType() == Element.COMMENT_NODE ) 
        {
            Comment comment=(Comment) nodeList.item(i);
            String data = comment.getData();
            if ( data.trim().startsWith( "<Context") )
            {
                data = data.replaceAll("reloadable\\s*=\\s*\"true\"", "reloadable=\"false\"");
                Comment newComment = doc.createComment(data);
                comment.getParentNode().appendChild(newComment);
                comment.getParentNode().removeChild(comment);
            }
    
        }
    }
    
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty( OutputKeys.METHOD, "xml" );
    transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "true" );
    transformer.setOutputProperty( OutputKeys.INDENT, "yes");
    StreamResult sr = new StreamResult( new File( "commentupdate.xml" ) );            
    transformer.transform( new DOMSource(doc), sr );