2010-10-07 2 views
2

Вот часть XML Я пытаюсь разобрать:Linq в XML ... Я никогда не получить какие-либо значения потомка с XML как есть

<?xml version="1.0" encoding="UTF-8"?> 
<Workflow xmlns="http://soap.sforce.com/2006/04/metadata"> 
    <alerts> 
     <fullName>Broker_Not_In_SF_Current_Broker_Account</fullName> 
     <description>Broker Not In SF - Current Broker Account</description> 
     <protected>false</protected> 
     <recipients> 
      <recipient>[email protected]</recipient> 
      <type>user</type> 
     </recipients> 
     <senderType>CurrentUser</senderType> 
     <template>Broker_Emails/Current_Broker_on_Acct_Not_in_SF</template> 
    </alerts> 
    <rules> 
     <fullName>No Service Contact Assigned</fullName> 
     <active>true</active> 
     <criteriaItems> 
      <field>Account.Type</field> 
      <operation>equals</operation> 
      <value>Client</value> 
     </criteriaItems> 
     <criteriaItems> 
      <field>Account.Service_Contact__c</field> 
      <operation>equals</operation> 
     </criteriaItems> 
     <description>Notification when a service contact has not been assigned after 5 days, then 8 days.</description> 
     <triggerType>onCreateOrTriggeringUpdate</triggerType> 
    </rules> 
</Workflow> 

я могу использовать простой Linq для XML на некоторой случайной SIMPLE XML-файл, но в этом случае ничего не получаю. Я предполагаю из-за пространства имен xml, но есть ли способ обойти это, кроме удаления этого в xml rile до разбора?

В прошлом я не выполнял много работы с XML, поэтому я пытаюсь понять, как я могу взять файл, как показано, и вытащить узлы правила для создания коллекции или правил со свойствами. Я могу получить объект/коллекция часть, но я застрял на том, почему пространство имен не удается это простой вызов:

var setting = xmlDoc.Descendants("rules").First(e => e.Element("fullName").Value == "No Service Contact Assigned"); 
Console.WriteLine(setting.Element("active").Value); 

Спасибо за любую помощь о том, что с этим делать и как правильно использовать пространство имен.

ответ

1

Вам нужно XNamespace так:

XNamespace ns = "http://soap.sforce.com/2006/04/metadata"; 
var setting = xmlDoc.Root.Descendants(ns+"rules").First(e => e.Element(ns+"fullName").Value == "No Service Contact Assigned"); 
Console.WriteLine(setting.Element(ns+"active").Value); 

Обратите внимание, что документ не является корневым узлом (например Workflow элемента), но свойство Root на документе. Я также добавил это.

+0

совершенны, простая вещь, я полагал, что я был с видом. – BryanGrimes

+0

Да, вы были очень близки. Пространства имен в XML всегда должны совпадать, чтобы получить желаемые результаты (не только для LINQ-to-XML, но также в XPath, XSLT, XQuery и т. Д.). – Lucero

+0

И мы должны помнить, что оператор «+» перегружен ... это моя первая известная встреча с перегрузкой оператора в дикой природе ... – rasx

1

Вы можете сделать это следующим образом:

 var setting = xmlDoc.Descendants(XName.Get("rules", "http://soap.sforce.com/2006/04/metadata")).First(e => e.Element(XName.Get("fullName", "http://soap.sforce.com/2006/04/metadata")).Value == "No Service Contact Assigned"); 
     Console.WriteLine(setting.Element(XName.Get("active", "http://soap.sforce.com/2006/04/metadata")).Value);