Чтение XML с пространствами имен на уровне атрибута с использованием c # - PullRequest
0 голосов
/ 04 октября 2018

У меня есть XML-файл, подобный следующему

<?xml version="1.0"?>
<appSettings xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="Key1" value="TransformValue1"/>
  <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="Key2" value="TransformValue2"/>
  <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="Key3" value="TransformValue3"/>
  <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="Key4" value="TransformValue4"/>

  <add xdt:Transform="Insert" key="Key6" value="TransformValue6"/>
</appSettings>

Я хочу получить этот XML в виде списка класса Key.здесь класс ключей следующий:

[Serializable]
public class Key
{
    public string Key { get; set; }
    public string Value { get; set; }
    public string Transform { get; set; }
    public string Locator { get; set; }
}

Пожалуйста, предложите

Привет всем, для лучшего понимания моей проблемы я обновляю вопрос с целью.

Цель: В рамках автоматического развертывания мы также планируем автоматизировать развертывание файла web.config.Для достижения этого процесса мы используем концепцию «преобразование веб-конфигурации».Чтобы добиться этого «преобразования веб-конфигурации», мы будем поддерживать файлы преобразования (для всех экземпляров и клиентов) на централизованном сервере, и они будут использоваться для преобразования.Но чтобы обновить файл преобразования, мы даем пользовательский интерфейс для члена группы развертывания.Для этого нам нужно прочитать конфигурацию XML с пространствами имен.

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Если вы создаете модели для хранения ваших данных, вы можете легко десериализовать объект из файла с 2 строками кода:

public class appSettings
{
    [XmlElement("add")]
    public List<Item> AddItems { get; set; }
}

public class Item
{
    [XmlAttribute("key")]
    public string Key { get; set; }
    [XmlAttribute("value")]
    public string Value { get; set; }
    [XmlAttribute(Namespace="http://schemas.microsoft.com/XML-Document-Transform")]
    public string Transform { get; set; }
    [XmlAttribute(Namespace="http://schemas.microsoft.com/XML-Document-Transform")]
    public string Locator { get; set; }
}

XmlSerializer ser = new XmlSerializer(typeof(appSettings));
var settings = (appSettings)ser.Deserialize(File.Open("test.xml", FileMode.Open));
settings.AddItems; //<- there is your list
0 голосов
/ 04 октября 2018

Вы пытались использовать метод XPathSelectElements класса XElement, в этом мы можем предоставить xpath для получения значения

ex-

doc.XPathSelectElements("//add[@xdt:Transform!=text() or not(@xdt:Transform)]", doc.Root.CreateNavigator());

Я нашел этот ответ отэтот пост прочитан отсюда

0 голосов
/ 04 октября 2018

Я хочу получить этот XML в виде списка класса Key.

Здесь я создаю консольное приложение для демонстрационных целей.

По приведенному ниже коду вы можете получитьсписок ваших элементов add внутри appSettings в вашем Key классе из вашего xml.

class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(@"Your xml here");
            XNamespace ns = doc.Root.GetDefaultNamespace();
            XNamespace xdt = "http://schemas.microsoft.com/XML-Document-Transform";

            var result = doc.Descendants(ns + "appSettings")
                .Elements(ns + "add")
                         .Select(x => new Key
                         {
                             Key1 = x.Attribute(xdt + "Transform") != null ? x.Attribute(xdt + "Transform").Value : "",
                             Value = x.Attribute(xdt + "Locator") != null ? x.Attribute(xdt + "Locator").Value : "",
                             Transform = x.Attribute("key") != null ? x.Attribute("key").Value : "",
                             Locator = x.Attribute("value") != null ? x.Attribute("value").Value : "",
                         }).ToList();


            result.ForEach(x => Console.WriteLine($"Transform: {x.Transform}, \t Locator: {x.Locator}, \t Key: {x.Key1}, \t Value: {x.Value}"));

            Console.ReadLine();
        }
    }



[Serializable]
    public class Key
    {
        public string Key1 { get; set; }
        public string Value { get; set; }
        public string Transform { get; set; }
        public string Locator { get; set; }
    }

Вывод:

enter image description here

0 голосов
/ 04 октября 2018

Я бы использовал XmlDocument для этого подхода.Одна из причин заключается в том, что вы можете просто выбрать все теги (в вашем случае add), которые вы хотите использовать.Во-вторых, с помощью foreach Loop вы можете легко получить все значения с помощью Attributes call

XmlDocument xdoc = new XmlDocument();

xdoc.LoadXml("YourXmlString");

XmlNodeList xNodes = xdoc.GetElementsByTagName("add");


foreach(XmlNode item in xNodes)
{    
    key = item.Attributes["state"].Value;

    //and so on
}

Я надеюсь, что смогу решить вашу проблему

...