Как сериализовать xml и получать только самые глубокие узлы - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть следующий xml файл

<?xml version="1.0" encoding="utf-8"?>
<root>
    <file_1>
        <file_name Value="" />
        <date Value="" />
        <information>
            <page1>
                <percentage Value="90%" />                
                <profit Value="50%" />                
                <total Value="$1500" />                
            </page1>
        </information>
    </file_1>
</root>

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

var xmlInfo = new List<xmlClass>();
var FieldName = xmlInfo[0].FieldName; // the value of FieldName should be percentage
var data = xmlInfo[0].Value; // the value of data should be 90%

Другими словами, меня интересуют только самые глубокие узлы, чтобы сериализовать их в объект.

У меня есть метод сериализации, но я не знаю, как создать класс.

public static T Deserialize<T>(XDocument doc)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

            using (var reader = doc.Root.CreateReader())
            {
                return (T)xmlSerializer.Deserialize(reader);
            }
        }

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Выражение XPath //*[not(child::node())] возвращает все элементы без дочерних узлов (либо дочерние элементы, либо дочерние текстовые узлы), если это соответствует вашему определению «самый глубокий».

0 голосов
/ 20 февраля 2020

Используйте xml linq со словарем:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, string> dict = doc.Descendants("page1")
                .First()
                .Elements()
                .GroupBy(x => x.Name.LocalName, y => (string)y.Attribute("Value"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...