Member 3657909 Ответов: 2

Получить только имя элемента и значение определенного родительского узла


У меня есть сценарий C# и XML, но я не могу его решить

<AppTestData>
    <Contact>
        <Name>Abe</Name>
        <Age>33</Age>
        <City>York</City>
        ...
    </Contact>
    <Agent>
        <Code>A103S</Code>
        <Region>North</North>
        <Resp>Service</Resp>
        ....
    </Agent>
    <Product>
        <Cat>Electronics</Cat>
        ...
    </Product> 
</AppTestData>


Я хотел получить имена дочерних элементов и значение в паре ключ-значение. Например контакт

Что я уже пробовал:

I tried like below
<pre>
XDocument doc = XDocument.Load(new XmlTextReader(xmlName));
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
            if (doc.Descendants("Contact") != null)
            {
                foreach (XElement element in doc.Descendants().Where(p => !p.HasElements))
                {
                    int keyInt = 0;
                    string keyName = element.Name.LocalName;

                    while (keyValuePairs.ContainsKey(keyName))
                    {
                        keyName = $"{element.Name.LocalName}_{keyInt++}";
                    }

                    keyValuePairs.Add(keyName, element.Value);
                }
            }
            return keyValuePairs;


Но он добавляет каждый другой узел элемента и значение от других родителей, таких как агент.

2 Ответов

Рейтинг:
1

phil.o

Вероятно, потому, что вы забыли ограничиться тем узлом, который вас интересует:

foreach (XElement element in doc.Descendants("Contact").Where(p => !p.HasElements))


Рейтинг:
0

Maciej Los

Попробовать это:

Dictionary<string, string>  contacts = xdoc.Descendants("Contact")
	.SelectMany((n, i) => n.Descendants()
		.Select(e => new KeyValuePair<string, string>(e.Name.ToString() + i.ToString(), e.Value)))
	.ToDictionary(kvp=>kvp.Key, kvp=>kvp.Value);
contacts.Dump();

Результат:
Key     Value
Name0    Abe 
Age0     33 
City0    York 
Name1    Ben 
Age1     66 
City1    New