2014-10-21 3 views
1
<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> 

Im пытается извлечь этотПолучить элемент из XDocument & Edit Attribute

<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"); 

ответ

1

Вы можете попробовать этот способ:

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

Использовать простой XNamespace + местное имя для ссылки на элемент в пространстве имен. Затем вы можете использовать метод .Attribute(), чтобы получить XAttribute с XElement и изменить значение атрибута.

+0

Работает идеально. Спасибо. Мне нравится использовать XNamespace лучше, чем namespacemanager ... гораздо меньше кода. – tonev

+1

'XmlNamespaceManager' используется, если вы используете XPath для запроса XML (в этом случае мы используем LINQ, а не XPath). Ваш исходный код должен работать даже если вы удалите 2 строки кодов с использованием 'XmlNamespaceManager' – har07

0

Попробуйте следующее: Он возвращает значение всех атрибутов в Продвижение Тег.

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 
     } 
Смежные вопросы