Получить дочерние элементы узла XML как словарь - PullRequest
0 голосов
/ 07 января 2011

Я хочу получить дочерний элемент (атрибуты) следующего XML как словарь, используя LINQ-to-XML ??

Поэтому при вызове

Dictionary<String,String> dict = ReadFromXml("TC_001","L3")  

я должен иметь возможность получить Control uid = "L3" из ControlList id = "TC_001"имя, пара значений в словаре как

["id", "googlelink"]
["name", null]
["class", null]
.
.
.

<?xml version="1.0"?>
<ControlList id="TC_001">
    <Control uid="L1">
        <Property name="Id"> <![CDATA[googlelink]]></Property>
        <Property name="Name"> null </Property>
        <Property name="Target"> null </Property>
<Property name="Innertext"> <![CDATA["Try searching me www.google.com"]]></Property>
        <Property name="Href"> <![CDATA["http://www.google.com/"]]></Property>  
    </Control>
    <Control uid="L2">
        <Property name="Id"> <![CDATA[googlelink]]></Property>
        <Property name="Name"> null </Property>
        <Property name="Class"> null </Property> 
        <Property name="ControlDefinition"> <![CDATA["id=googlelink href=\"http://www.google.co"]]> </Property>
        <Property name="TagInstance"> 1 </Property> 
    </Control>
    <Control uid="L3">
        <Property name="Id"> <![CDATA[googlelink]]></Property>
        <Property name="Name"> null </Property>
        <Property name="Target"> null </Property>
        <Property name="Innertext"> <![CDATA["Try searching me www.google.com"]]></Property>        
    </Control>
</ControlList>

Редактировать 8/1: один и тот же вопрос отличается структура XML.(узлы теперь не имеют названия «Property»)

    <?xml version="1.0"?>
    <ControlList id="TC_001">
        <Control uid="L1">
            <Id> <![CDATA[googlelink]]><Id>
            <Name> null </Name>
            <Target> null </Target>
                   <Innertext> <![CDATA["Try searching me www.google.com"]]></Innertext>
        </Control>
             <!-- more multiple controls similar to above-->
 </ControlList>

1 Ответ

1 голос
/ 07 января 2011

Вот пример C #:

static void Main()
{
    XDocument controls = XDocument.Load(@"..\..\XMLFile1.xml");
    string id1 = "TC_001", id2 = "L3";

    Dictionary<string, string> props =
        ReadFromXml(controls, id1, id2);
    foreach (string key in props.Keys)
    {
        Console.WriteLine("{0}: {1}", key, props[key]);
    }
}
static Dictionary<string, string> ReadFromXml(XDocument controlDoc, string listId, string controlId)
{
    return controlDoc
        .Elements("ControlList")
        .First(c => (string)c.Attribute("id") == listId)
        .Elements("Control")
        .First(c => (string)c.Attribute("uid") == controlId)
        .Elements("Property")
        .ToDictionary(p => (string)p.Attribute("name"),
        p => { string value = p.Value.Trim(); return value == "null" ? null : value; });
}

Предполагается, что переданные идентификаторы всегда присутствуют в переданном XML, в противном случае вызовы First () вызовут исключение.

[править] Для измененной структуры XML вы можете использовать следующую адаптацию метода:

static Dictionary<string, string> ReadFromXml(XDocument controlDoc, string listId, string controlId)
{
    return controlDoc
        .Elements("ControlList")
        .First(c => (string)c.Attribute("id") == listId)
        .Elements("Control")
        .First(c => (string)c.Attribute("uid") == controlId)
        .Elements()
        .ToDictionary(el => el.Name.LocalName,
        el => { string value = el.Value.Trim(); return value == "null" ? null : value; });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...