【问题标题】:XML element change value in C#C# 中的 XML 元素更改值
【发布时间】:2014-03-12 09:39:38
【问题描述】:

c#代码如下:

using (XmlReader Reader = XmlReader.Create(DocumentPath, XmlSettings))
{
    while (Reader.Read())
    {
        switch (Reader.NodeType)
        {
            case XmlNodeType.Element:
                //doing function
                break;
            case XmlNodeType.Text:
                if(Reader.Value.StartsWith("_"))
                {
                     // I want to replace the Reader.Value to new string
                }
                break;
            case XmlNodeType.EndElement:
                //doing function
                break;
            default:
                //doing function
                break;
        }
    }
}

我想在 XmlNodeType = text 时设置新值。

【问题讨论】:

  • 您能描述一下您面临的实际问题吗?是什么阻止您进行所需的替换?
  • 不知道怎么替换值,因为Reader.Value是ReadOnly
  • 好吧,您使用的是..Reader。如果你想,你可能需要..Writer。是否只想用新值再次覆盖文件?
  • 是的,只是想用新值再次覆盖文件。需要用XmlWriter重写整个xml??

标签: c# xml xmlreader


【解决方案1】:

这个操作有3个步骤:

  1. 将文档作为对象模型加载(XML 是一个层次结构,如果这样更容易的话)
  2. 更改对象模型中的值
  3. 将模型重新保存为文件

加载方法由您决定,但我建议使用XDocument 和相关的 Linq-to-XML 类来完成此类较小的任务。太简单了as demonstrated in this stack.

编辑 - 对您的场景有用的报价

XML 元素可以包含文本内容。有时内容很简单 (该元素只包含文本内容),有时内容是 混合(元素的内容包含文本和其他 元素)。在任何一种情况下,每个文本块都表示为 XText 节点。

来自MSDN - XText class

这是一个使用 cmets 中的 xml 的控制台应用程序的代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace TextNodeChange
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = @"<Info><title>a</title><content>texttexttexttexttext<tag>TAGNAME</tag>texttexttex‌​ttexttext</content>texttexttexttexttext</Info>";

            XDocument doc = XDocument.Parse(input);
            Console.WriteLine("Input document");
            Console.WriteLine(doc);

            //get the all of the text nodes in the content element
            var textNodes = doc.Element("Info").Element("content").Nodes().OfType<XText>().ToList();

            //update the second text node
            textNodes[1].Value = "THIS IS AN ALTERED VALUE!!!!";

            Console.WriteLine();
            Console.WriteLine("Output document");
            Console.WriteLine(doc);
            Console.ReadLine();
        }
    }
}

为什么需要 3 个步骤?

xml 的元素在文件中是可变长度的。更改值可能会更改文件该部分的长度并覆盖其他部分。因此,您必须反序列化整个文档,进行更改并再次保存。

【讨论】:

  • 谢谢。但是xml结构很奇怪。如:a texttexttexttexttextTAGNAMEtexttexttexttexttexttexttexttexttexttext,我不知道如何替换 XDocument 中的“文本”跨度>
  • @CAM xml 示例在开始时会非常有用,因为我可以编写代码示例。 XML 允许元素节点和原始文本的混合内容。此文本在对象模型中表示为文本元素。 Linq-to-XML 将其定义为XText。它将显示为父 XElement 中的子节点之一。 msdn.microsoft.com/en-us/library/…
  • 这个信息很有用,谢谢。但是你能帮忙写一个示例代码吗??
  • 非常有用!!再次感谢?
【解决方案2】:

您不能替换 reader.value 只读属性。您需要使用 XmlWriter 来创建自己的 xml 并替换您想要的任何值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多