1

私はこのXMLファイルを持っています:

<Credentials>
   <WebsiteApplication id="test">
      <Username>ADMIN</Username>
      <Password>ADMIN</Password>
   </WebsiteApplication>
</Credentials>
<Credentials>
   <WebsiteApplication id="test2">
      <Username>ADMIN2</Username>
      <Password>ADMIN2</Password>
   </WebsiteApplication>
</Credentials>

そして、「WebsiteApplication」ノードのユーザー名(またはパスワード)を編集したいのは、そのIDが入力したものと同じ場合のみです..

私は何かを試しましたが、うまくいきません...

 System.out.println("Insert the id:....");
    BufferedReader websiteIn = new BufferedReader(new InputStreamReader(System.in));
    String Editid = websiteIn.readLine().toString();


    Document doc = SecondaryFuncts.FindXML();

    Element root = doc.getDocumentElement();
    NodeList rootlist = root.getChildNodes();
    for(int i=0; i<rootlist.getLength(); i++) 
    {


//THERE IS NO PROBLEM UNTILL NOW... 
//And now i trying to take the id and check if matches
//with my input and them change nodes elements...

        Element Applications = (Element)rootlist.item(i);
        NamedNodeMap id = Applications.getAttributes();
        for(int ids = 0 ; ids <id.getLength(); ids++)
        {


I tried a lot in this loop but nothing worked.. what can i do here? 
Lets assume that i want username and password to change both as "test"

        }
4

1 に答える 1

1

このようなタスクには XPath を使用します。正しい要素を直接選択すると、その要素と子WebsiteApplication要素を変更できます。UsernamePassword

次の XPath/Credentials/WebsiteApplication[@id="XXX"]で正しい要素を選択します。ここXXXで、 はユーザーによって提供された入力です。

次に、その要素の子を取得して、ユーザー名/パスワードの内容を変更します。

String inputId = "test1";
String xpathStr = "//Credentials/WebsiteApplication[@id='" + inputId + "']";
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(xpathStr);
Node node = (Node)expr.evaluate(doc, XPathConstants.NODE);
// node is the correct <WebsiteApplication> element
// do what you have to do with its children using node.getChildNodes()

// or you can even access directly the two elements
expr = xpath.compile(xpathStr + "/Username");
Node username = (Node)expr.evaluate(doc, XPathConstants.NODE);
// and set their values using the setTextContent() method
username.setTextContent("test-username");

expr = xpath.compile(xpathStr + "/Password");
Node password = (Node)expr.evaluate(doc, XPathConstants.NODE);
password.setTextContent("test-password");

この完全なサンプルを参照してください。

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.*;

public class SO12477695 {
    public static void main(String[] args) throws Exception {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader("<root>\r\n" + //
                "<Credentials>\r\n" + //
                "   <WebsiteApplication id=\"test\">\r\n" + //
                "      <Username>ADMIN</Username>\r\n" + //
                "      <Password>ADMIN</Password>\r\n" + //
                "   </WebsiteApplication>\r\n" + //
                "</Credentials>\r\n" + //
                "<Credentials>\r\n" + //
                "   <WebsiteApplication id=\"test2\">\r\n" + //
                "      <Username>ADMIN2</Username>\r\n" + //
                "      <Password>ADMIN2</Password>\r\n" + //
                "   </WebsiteApplication>\r\n" + //
                "</Credentials>\r\n" + //
                "</root>")));
        String inputId = "test2";
        String xpathStr = "//Credentials/WebsiteApplication[@id='" + inputId + "']";
        // retrieve elements and change their content
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr = xpath.compile(xpathStr + "/Username");
        Node username = (Node) expr.evaluate(doc, XPathConstants.NODE);
        username.setTextContent("test-username");
        expr = xpath.compile(xpathStr + "/Password");
        Node password = (Node) expr.evaluate(doc, XPathConstants.NODE);
        password.setTextContent("test-password");
        // output the document
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(doc), new StreamResult(writer));
        System.out.println(writer.toString());

        // the document is now saved, you may want to save it in a file.
    }
}

これは次のように出力されます:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
   <Credentials>
      <WebsiteApplication id="test">
         <Username>ADMIN</Username>
         <Password>ADMIN</Password>
      </WebsiteApplication>
   </Credentials>
   <Credentials>
      <WebsiteApplication id="test2">
         <Username>test-username</Username>
         <Password>test-password</Password>
      </WebsiteApplication>
   </Credentials>
</root>
于 2012-09-18T13:28:21.057 に答える