2013-06-29 54 views
0

例如,我有这个文件的XML:修改XML文件

<http auto-config="true"> 
     <intercept-url access="ROLE_ADMIN,ROLE_USER" pattern="/"/> 
     <intercept-url access="ROLE_ADMIN,ROLE_USER" pattern="/index*"/> 
     <intercept-url access="ROLE_ADMIN" pattern="/page1"/> 
     <intercept-url access="ROLE_ADMIN" pattern="/page2"/> 
     <intercept-url access="ROLE_ADMIN" pattern="/page33"/> 

</http> 

我想改变这条线的元素“接入”的文字:

<intercept-url access="ROLE_ADMIN" pattern="/page33"/> 

所以我创建这个代码:

import java.io.File; 
import java.io.IOException; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

import com.sun.xml.internal.ws.org.objectweb.asm.Attribute; 

public class ChangeXMLFile { 

    public static void main(String argv[]) { 

     try { 
     String filepath = "D:\\Myfile.xml"; 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(filepath); 


     Node company = doc.getFirstChild(); 

     Node staff = doc.getElementsByTagName("intercept-url").item(0); 

     NodeList list = staff.getChildNodes(); 

     for (int i = 0; i < list.getLength(); i++) { 

        Node node = list.item(i); 


      if ("pattern".equals(node.getNodeName())) { 
       if(("/page33").equals(node.getTextContent())){ 


        NamedNodeMap attr = staff.getAttributes(); 
        Node nodeAttr = attr.getNamedItem("access"); 
        nodeAttr.setTextContent("ROLE_ANONYM"); 
       } 

      } 




     } 


     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File(filepath)); 
     transformer.transform(source, result); 

     System.out.println("Done"); 

     } catch (ParserConfigurationException pce) { 
     pce.printStackTrace(); 
     } catch (TransformerException tfe) { 
     tfe.printStackTrace(); 
     } catch (IOException ioe) { 
     ioe.printStackTrace(); 
     } catch (SAXException sae) { 
     sae.printStackTrace(); 
     } 
    } 
} 

但我没有改变。如何让程序读取xml文件的每一行,并根据内容“pattern”的内容更改“access”属性?

回答

1

你已经得到了层级都错了。尝试这样的代替:

 DocumentBuilderFactory docFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(...; 

     NodeList list = doc.getElementsByTagName("intercept-url"); 

     for (int i = 0; i < list.getLength(); i++) { 
      Element node = (Element) list.item(i); 
      Attr pattern = node.getAttributeNode("pattern"); 
      if (pattern != null && pattern.getValue().equals("/page33")) { 
       node.setAttribute("access", "ROLE_ANONYM"); 
      } 
     } 

     TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(...); 
     transformer.transform(source, result); 
+0

heyyy我第一次有同样的好回答(甚至更早),为什么它是你的验证?我提出索赔:) – skoll

+0

这就是生活,残酷和不公平:-)但是你错过了属性节点不是任何子节点的部分,所以它不会使用现有的属性逻辑。 –

+0

好吧,这是真的我甚至没有尝试了解为什么,如果属性可能通过NamedNodeMap使用。主要问题是如此明显,我停在这里。 – skoll

0

你应该在调试检查,

Node staff = doc.getElementsByTagName("intercept-url").item(0); 

    NodeList list = staff.getChildNodes(); 

列表为空:员工是你的第一个“拦截的URL”节点,所以当你试图获得其子女的结果列表是空的。

尝试,而不是像这样:

NodeList staffList = doc.getElementsByTagName("intercept-url");