【问题标题】:Changing values in XML file更改 XML 文件中的值
【发布时间】:2013-08-10 02:17:00
【问题描述】:

我需要更改我的 configuration.xml 中的密码值。

以下用户需要修改密码:

  1. tsuer1
  2. github
  3. wtsntro
  4. wtsntrw 等等。

configuration.xml 文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<server xmlns="urn:jboss:domain:1.2">
  <extensions>
    <extension module="org.jboss.as.clustering.infinispan" />
    <extension module="org.jboss.as.cmp" />
    <extension module="org.jboss.as.ejb3" />
  </extensions>
  <system-properties>
    <property name="SERVER" value="JBOSS" />
    <property name="FTP_USER" value="adobenet\wtsntrw" />
    <property name="FTP_PASSWORD" value="password value" />
    <property name="FTP_READ_USER" value="adobenet\\wtsntro" />
    <property name="FTP_READ_PASS" value="password value" />
    <property name="API_SECRET_KEY" value="wxrocks" />
    <property name="API_ENV" value="regular" />
    <property name="PRERELEASE_PASSWORD" value="prerelease" />
    <property name="watson.git_user" value="github" />
    <property name="watson.git_pwd" value="password value" />
    <property name="teststudio.user" value="tsuser1" />
    <property name="teststudio.pwd" value="password value" />
  </system-properties>
</server>

以下是我尝试但失败的代码:

XmlDocument doc = new XmlDocument();
            string path = @"C:\Users\karansha\Desktop\configuration.xml";  // location of configuration.xml file.
            doc.Load(path);
            // Using foreach loop for specific Xmlnodes.
            foreach (XmlNode selectNode in doc.SelectNodes("server/system-properties/property"))
            {
                if (selectNode.Attributes["name"].Value == "teststudio.pwd")  // tsuser1
                {
                    selectNode.Attributes["value"].Value = "new password";  // changes password value for "FTP_USER".
                }

                if (selectNode.Attributes["name"].Value == "watson.git_pwd")   //github
                {
                    selectNode.Attributes["value"].Value = "new passwordx";  // changes password value for "FTP_READ_USER".
                }
                if (selectNode.Attributes["name"].Value == "FTP_READ_PASS")   // wtsntro
                {
                    selectNode.Attributes["value"].Value = "new_passwordy";  // changes password value for "FTP_PASSWORD".
                }
            }

            doc.Save(path);  // Save changes.
            Console.WriteLine("Password changed successfully");
            Console.ReadLine();

【问题讨论】:

  • 失败的原因是什么?
  • 对,但我认为 doc.SelectNodes 有问题?
  • @Romoku :它没有给出任何错误消息,但仍然无法在 configuration.xml 文件中执行更改。
  • @AseemKamaal 调试它并找出原因。
  • @aevitas:我调试了它,发现我的代码无法进入 foreach 循环。 doc.SelectNodes 中似乎有些问题

标签: c#


【解决方案1】:

你必须指定命名空间:

var nm = new XmlNamespaceManager(doc.NameTable);
if (doc.ChildNodes.Count != 2)
    throw new XmlException("Document is not well formated.");
var serverNode = doc.ChildNodes[1];
nm.AddNamespace("a", serverNode.NamespaceURI);
foreach (XmlNode selectNode in 
    doc.SelectNodes("a:server/a:system-properties/a:property", nm))
{
    // ...
}

【讨论】:

  • 感谢您的快速解决方案。
【解决方案2】:

您的 Xml 元素包含在 NameSpace 中,因此您的 XPath 需要考虑这一点。

见:

XPath on an XML document with namespace

XML Namespaces and How They Affect XPath and XSLT

XmlDocument doc = new XmlDocument();
doc.Load(path);

var nm = new XmlNamespaceManager(doc.NameTable);
nm.AddNamespace("jb", "urn:jboss:domain:1.2");

foreach (XmlNode selectNode in doc.SelectNodes("jb:server/jb:system-properties/jb:property", nm))
{
    if (selectNode.Attributes["name"].Value == "teststudio.pwd")  // tsuser1
    {
        selectNode.Attributes["value"].Value = "new password";  // changes password value for "FTP_USER".
    }

    if (selectNode.Attributes["name"].Value == "watson.git_pwd")   //github
    {
        selectNode.Attributes["value"].Value = "new passwordx";  // changes password value for "FTP_READ_USER".
    }

    if (selectNode.Attributes["name"].Value == "FTP_READ_PASS")   // wtsntro
    {
        selectNode.Attributes["value"].Value = "new_passwordy";  // changes password value for "FTP_PASSWORD".
    }
}

doc.Save(path);  // Save changes.
Console.WriteLine("Password changed successfully");

【讨论】:

  • 还有一件事是当用户需要在单个文件中执行此操作时,如果有多个文件该怎么办。
  • 如果命名空间和架构相同,那么它将起作用。如果命名空间不同,则@alexfilipocici 的解决方案有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多