在 XML 文件中保存特定节点

Posted

技术标签:

【中文标题】在 XML 文件中保存特定节点【英文标题】:Saving Particular Node in XML File 【发布时间】:2011-07-14 20:16:19 【问题描述】:

我正在使用来自特定节点的信息填充文本框,基于它的 ConfirmNum。然后,当所有信息都更新后,我将信息(通过提交按钮)保存回特定节点。

但是,在保存后,XML 文件中为空的每个节点都会下降到另一行。

保存前的 XML 示例:

<OnlineBanking>
  <Transactions>
    <Txn>
      <Login></Login>
      <UserName>userName</UserName>
      <CustomerName>CustomerName</CustomerName>
      <ConfirmNum>1234</ConfirmNum>
    </Txn>
  </Transactions>
</OnlineBanking>

我的代码(如下)将根据Page.aspx?CID=1234 编号保存该节点的信息。但是,整个 XML 文件中的每个空白节点现在都将有一个换行符。不仅仅是我们刚刚编辑的Txn,而是全部。

这是我的代码:

protected void btnSubmit_Click(object sender, EventArgs e)

    XmlDocument item = new XmlDocument();
    item.Load(xmlFileName);
    if (CID != "")
    
        XmlNode xlist = item.SelectSingleNode("OnlineBanking/Transactions/Txn[ConfirmNum=" + CID + "]");
        if (xlist != null)
        
            xlist.ChildNodes.Item(0).InnerText = tbLogin.Text;
            xlist.ChildNodes.Item(1).InnerText = tbUserName.Text;
            xlist.ChildNodes.Item(2).InnerText = tbCustomerName.Text;
            item.Save(xmlFileName);
        
    

保存后的 XML 示例:

<OnlineBanking>
  <Transactions>
    <Txn>
      <Login>
      </Login>
      <UserName>userName</UserName>
      <CustomerName>CustomerName</CustomerName>
      <ConfirmNum>1234</ConfirmNum>
    </Txn>
  </Transactions>
</OnlineBanking>

注意&lt;login&gt;&lt;/login&gt; 的位置不同。这就是我所说的。希望有人能清楚地看到我没有在做什么。

【问题讨论】:

一行或两行有什么关系?是破坏了程序还是破坏了人类的完美感? 【参考方案1】:

尝试将 PreserveWhitespace 属性设置为 True,看看它是否会在调用 Save 时停止插入换行符:

XmlDocument item = new XmlDocument();
item.PreserveWhitespace = true;
item.Load(xmlFileName);

【讨论】:

保存并运行代码时出现错误:System.ArgumentException: The string for white space contains an invalid character. 对于这一行:xlist.ChildNodes.Item(2).InnerText = tbCustomerName.Text; 我把item.PreserveWhitespace = true; 放在item.Save(xmlFileName); 之前,它把所有东西都放在了一行。 您尝试分配给 CustomerName 的字符串是什么? tbCustomerName 有一个值:First Last @bemused,我还没弄明白。我的意思是整个 XML 文件都在一行上,而不仅仅是 【参考方案2】:

一种折衷方案是:

if(string.IsNullOrWhiteSpace(tbLogin.Text))
   xlist.ChildNodes.Item(0).IsEmpty = true;
else
   xlist.ChildNodes.Item(0).InnerText = tbLogin.Text;

这会给你:

<Login />

【讨论】:

读取&lt;login&gt;&lt;/login&gt; 行的程序不会将其识别为&lt;login /&gt;

以上是关于在 XML 文件中保存特定节点的主要内容,如果未能解决你的问题,请参考以下文章

在 xml 文件中的特定节点之后插入一个节点

计算特定XML节点c#的子节点数[重复]

如何使用 vbscript 删除 XML 文件中的特定节点

在 PHP 中显示特定的 XML 节点

使用多个 XML 文件中的特定 XML 节点填充 datagridview

在 C# 中循环遍历 XML 的特定节点