Как мне получить доступ к этой структуре XML с помощью Linq в C #? - PullRequest
1 голос
/ 24 августа 2011

Я довольно новичок в этом деле, и мне трудно понять, как правильно получить доступ к моим данным.У меня есть XML-дерево в этой форме:

<bpm:ResponseData
xmlns:bpm="http://rest.bpm.ibm.com/v1/data">
<status>200</status>    
<data
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srch="http://rest.bpm.ibm.com/v1/data/search"
xsi:type="srch:SearchDetails">  
    <data>  
        <item key="assignedToUser"/>    
        <item key="bpdName">    
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Some process name
            </value>
        </item>
        <item key="instanceDueDate">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                2011-09-06T12:35:48Z
            </value>
        </item>
        <item key="taskId">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:decimal">
                218
            </value>
        </item> 
        <item key="taskSubject">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Task: Some process related task
            </value>
        </item>
    </data> 
    <data>  
        <item key="bpdName">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Another process name
            </value>
        </item> 
        <item key="instanceStatus">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Active
            </value>
        </item> 
        <item key="taskId"> 
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:decimal">
                253
            </value>
        </item>
        <item key="taskSubject">    
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Task: Another process related task
            </value>
        </item>
    </data>
</data>
</bpm:ResponseData>

Мне нужно извлечь из этих данных ровно две вещи: taskSubject и taskId.Желательно таким способом, который позволил бы мне перебирать их.Было бы неплохо что-то, связанное с новым {subject, id}.

Я не совсем уверен, как справиться с задачей ...

С

var items = from feed in XMLDocument.Descendants("data").Descendants("data") select feed;

Я получаюдва элемента данных.Есть ли способ развернуть их дальше, возвращая значение потомка с определенным атрибутом «ключа»?

С уважением, Майкл

РЕДАКТИРОВАТЬ:

Я понял этобудет работать:

var items = from feed in XMLDocument.Descendants("data").Descendants("data") select 
    new{
        subject = from subjects in feed.Elements() where (subjects.Attribute("key").Value=="taskSubject") select subjects.Value,
        id = from subjects in feed.Elements() where (subjects.Attribute("key").Value == "taskId") select subjects.Value
        };

Но это кажется довольно "грязным" ...

1 Ответ

2 голосов
/ 24 августа 2011

Это немного хакерски, но должно работать (проверено на Mono 2.10.2):

var items = from data in document.Descendants("data")

            let taskId =
                data.Elements("item")
                .Where(i => (string)i.Attribute("key") == "taskId")
                .FirstOrDefault()

            where taskId != null

            let taskSubject = 
                data.Elements("item")
                .Where(i => (string)i.Attribute("key") == "taskSubject")
                .FirstOrDefault()

            where taskSubject != null

            select new {
                TaskId = taskId.Element("value").Value.Trim(),
                TaskSubject = taskSubject.Element("value").Value.Trim()
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...