Linq to XML ... Я никогда не получаю никаких потомственных значений с XML как есть - PullRequest
2 голосов
/ 07 октября 2010

Вот часть 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>GeddyLee@YYZ.com</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 to XML для некоторого случайного простого XML-файла, но в этом случае я ничего не получаю.Я предполагаю, что из-за пространства имен xml, но есть ли способ обойти это, кроме как удалить его из файла xml перед разбором?

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

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

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

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Вы можете сделать это так:

        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);
1 голос
/ 07 октября 2010

Вам нужен 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 в документе является.Я также добавил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...