Получить элемент из 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 + локальное имя для ссылки на элемент в пространстве имен. Затем вы можете использовать метод .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