Вземете елемент от XDocument и редактирайте атрибут

<GetPromotionByIdResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="2" xmlns="http://fake.com/services">
    <Header>
        <Response ResponseCode="OK">
            <RequestID>1</RequestID>
        </Response>
    </Header>
    <Promotion PromotionId="5200" EffectiveDate="2014-10-10T00:00:00" ExpirationDate="2014-11-16T23:59:00" PromotionStatus="Active" PromotionTypeName="DefaultPromotion">
        <Description TypeCode="Long" Culture="en-AU">Promotion Description</Description>
    </Promotion>
</GetPromotionByIdResponse>

Опитвам се да извлека това

<Promotion PromotionId="5200" EffectiveDate="2014-10-10T00:00:00" ExpirationDate="2014-11-16T23:59:00" PromotionStatus="Active" PromotionTypeName="DefaultPromotion">
        <Description TypeCode="Long" Culture="en-AU">Promotion Description</Description>
    </Promotion>

и конвертирайте PromotionId="5200" в PromotionId="XXX"

Мога да извлека елемента ‹ Promotion > с кода по-долу, но не мога да разбера как да променя атрибута

XNamespace xmlResponseNamespace = xmlPromotionResponse.Root.GetDefaultNamespace();

        XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable());
        nsm.AddNamespace("def", xmlResponseNamespace.ToString());

        XElement xmlPromotionElement =
            xmlPromotionResponse
            .Descendants().SingleOrDefault(p => p.Name.LocalName == "Promotion");

person Anthony    schedule 21.10.2014    source източник


Отговори (2)


Можете да опитате по този начин:

XNamespace ns = "http://fake.com/services";
XElement xmlPromotionElement = xmlPromotionResponse.Descendants(ns+"Promotion")
                                                   .SingleOrDefault();
xmlPromotionElement.Attribute("PromotionId").Value = "XXX";

Използвайте просто XNamespace + local-name, за да посочите елемент в пространството на имената. След това можете да използвате метода .Attribute(), за да получите XAttribute от XElement и да промените стойността на атрибута.

person har07    schedule 21.10.2014
comment
Работи перфектно. Много благодаря. Харесва ми да използвам XNamespace по-добре от namespacemanager... толкова по-малко код. - person Anthony; 22.10.2014
comment
XmlNamespaceManager се използва, ако използвате XPath за заявка към XML (в този случай използваме LINQ, а не XPath). Вашият оригинален код трябва дори да работи, ако премахнете 2 реда кодове, включващи XmlNamespaceManager - person har07; 22.10.2014

Опитайте това: Връща стойността на всички атрибути в етикета Promotion.

 XNamespace ns1 = XNamespace.Get("http://fake.com/services");
 var readPromotion = from a in xx.Descendants(ns1 + "Promotion")
                            select new
                            {
                                PromotionID = (string)a.Attribute("PromotionId"),
                                EffectiveDate = (string)a.Attribute("EffectiveDate"),
                                ExpirationDate = (string)a.Attribute("ExpirationDate"),
                                PromotionStatus = (string)a.Attribute("PromotionStatus"),
                                PromotionTypeName = (string)a.Attribute("PromotionTypeName"),
                                Description = (string)a.Value

                            };

        foreach (var read in readPromotion)
        {
            // Read values
        }
person Thirisangu Ramanathan    schedule 21.10.2014