替换XML中的属性值(attrubute path变量)

时间:2017-11-07 10:06:34

标签: c# xml xmldocument xmlreader

我正在使用包含类似于此的结构的XML文档:

<SW.Blocks.OB ID="$">
<AttributeList>
<ObjectList>
  <MultilingualText ID="$" CompositionName="Comment">
    <ObjectList>
      <MultilingualTextItem ID="$" CompositionName="Items">
        <AttributeList>
          <Culture>en-US</Culture>
          <Text />
        </AttributeList>
      </MultilingualTextItem>
      <MultilingualTextItem ID="$" CompositionName="Items">
        <AttributeList>
          <Culture>nl-NL</Culture>
          <Text />
        </AttributeList>
      </MultilingualTextItem>
      <MultilingualTextItem ID="$" CompositionName="Items">
        <AttributeList>
          <Culture>de-DE</Culture>
          <Text />
        </AttributeList>
      </MultilingualTextItem>
    </ObjectList>
  </MultilingualText>
</ObjectList>
</SW.Blocks.OB>

我正在搜索属性ID。此属性可以在任何地方出现 我已经可以找到那些ID的值

        XmlTextReader reader = new XmlTextReader(@"Main.xml");
        while (reader.Read())
        {
            reader.MoveToContent();
            string test = reader.GetAttribute("ID");

            if (test == "$")
            {
             MessageBox.Show(test);
            } 
        }

但我无法改变它们。 目标:找到ID,无论在何处,并用“值”替换该属性的值。

谁能帮助我?我已经尝试过Xdocument和Xmldocument。我无法理解。

2 个答案:

答案 0 :(得分:1)

使用xml linq

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


namespace ConsoleApplication13
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<XElement> ids = doc.Descendants().Where(x => x.Attribute("ID") != null).ToList();

            int indNo = 1;
            foreach (XElement id in ids)
            {
                id.Attribute("ID").SetValue(indNo++);
            }



        }


    }

}

答案 1 :(得分:-1)

我相信使用XmlDocumentXPathNavigator

会更容易

您加载文档,然后使用XPath在其上导航,然后更改所需的值。

例如::

XmlDocument _soapEnvelopeXml = new XmlDocument();
_soapEnvelopeXml.Load(".xml");
XPathNavigator _xmlNav = _soapEnvelopeXml.FirstChild.CreateNavigator().SelectSingleNode(WebServiceEnum.MAIN_CIL_TAG);

        _xmlNav.CreateNavigator().SelectSingleNode("*[local-name()='BUID']").SetValue(buid);
        _xmlNav.CreateNavigator().SelectSingleNode("*[local-name()='CustomerNumber']").SetValue(customerNum);