簡體   English   中英

更改現有xml屬性值的值,無LINQ,C#

[英]change value of existing xml attribute's value, no LINQ, C#

我想使用C#更改現有屬性值的值。

我似乎無法在Google上找到答案,可能是因為我不太了解該術語,無法聰明地提出問題。

我可以找到:

  • 很多方法來編寫一個新的 XML文檔,用新的元素屬性\\
  • 讀取現有元素屬性值的方法

但是我找不到一種方法來向下鑽取一個已經存在的元素的屬性並更改該屬性的值。

為了提供上下文,我們假設這是位於C:\\ stuff.xml的名為“ stuff.xml”的xml文件:

<?xml version="1.0" encoding="utf-8"

<configuration>
    <add key="apple" 
         value="red"/>
    <add key="school_bus" 
         value="yellow"/>
    <add key="grass" 
         value="orange"/>
    <system.Net>
          <binding>
                <endpoint address="https://1111.11.11.11:7276/Service"
                          binding="basicHttpBinding"/>
                 <endpoint address="http://localhost/Service"
                           binding="advancedHttpBinding"/>
           </binding>
</configuration>

我想做的-不使用LINQ-是將草的顏色值更改為“綠色”,並將第一個端點的地址更改為https://222.22.22.22:7276/Service

(我不習慣不使用LINQ,只是作為非LINQ用戶,我發現它不可讀。)

我敢肯定有辦法做到這一點! (而且可能很容易找到-我只是找不到。)

我想象答案將使用XmlWriter對象,只是我不知道如何向下鑽取一個子元素然后使用XmlWriter對象。


@maccettura:您的可疑思想是正確的……有點。 這是一個配置文件,但不是app.config文件。 而且它必須改變。 嗯...序列化。 好。 我已經看過了,但是我一直認為序列化基本上是將整個文件的值讀入一個對象,然后您將可以使用它進行處理……我將對此進行研究。 謝謝。

應該使用LINQ to XML,因為它非常簡單:

var xml = XDocument.Parse(@"C:\stuff.xml");

xml.XPathSelectElement("configuration/add[@key='grass']")
  ?.SetAttributeValue("value", "green")

xml.XPathSelectElement("configuration/system.Net/binding/endpoint[@address='https://1111.11.11.11:7276/Service']")
  ?.SetAttributeValue("address", "https://222.22.22.22:7276/Service")

或者,如果您不喜歡XPath語法:

xml.Root
   .Elements("add")
   .Where(o => (string)o.Attribute("key") == "grass")
   .FirstOrDefault()
  ?.SetAttributeValue("color", "green");

xml.Root
   .Element("system.Net")
  ?.Element("binding")
  ?.Elements("endpoint")
   .FirstOrDefault(o => (string)o.Attribute("address") == "https://1111.11.11.11:7276/Service")
  ?.SetAttributeValue("address", "https://222.22.22.22:7276/Service")

無論哪種方式,保存文件都很容易:

xml.Save(@"C:\stuff.xml")

簽出對此問題的答案,查找由於您不想使用LINQ而使用XmlDocument的答案。 如何更改XML屬性

您可以將xml文件序列化,讀取和反序列化為代碼中的對象。

        YourObjectClass yourObjectName = new YourObjectClass();

        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(YourObjectClass));

            using (TextReader reader = new StreamReader(locationString))
            {
               yourObjectName = (YourObjectClass)serializer.Deserialize(reader);
            }
        }
        catch (Exception ex)
        {
            //do whatever you need to with caught exceptions here.
        }

您的課程將如下所示:

[Serializable]
public class YourObjectClass
{
    public string StringValue1 { get; set; }

    public string StringValue2{ get; set; }

    [XmlElement("YourOtherObjectClass")]
    public List<YourOtherObjectClass> OtherObjectClassList = new List<YourOtherObjectClass>();
}

[Serializable]
public class YourOtherObjectClass
{
    public string StringValue1 { get; set; }
}

你會需要:

using System.Xml.Serialization;

從字面上看,這是將xml引入代碼中的最簡單方法。 如果您真的嘗試的話,您可能可以減少行數,但這是簡短明了的。 然后,您可以在代碼中操縱這些值中的任何一個以滿足您的需要,然后再使用它們。

如評論中所述,如果您正在閱讀配置,則可能不應該在代碼中對其進行編輯然后保存。 但是,如果您有一些邏輯需要在不同情況下使用不同的值,則可以將xml反序列化為一個對象,然后對其進行操作。 那就是對象的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM