XML-файл - две версии - одни и те же данные - атрибут Element + изменение имени - PullRequest
0 голосов
/ 29 сентября 2019

Я получу эти два xmls

<XML>
    <Name>Test</Name>
</XML>

или

<XML1 Name1="Test">
</XML1>

Я хотел бы знать, есть ли способ обработки значения для элемента «Имя» иАтрибут "Name1", использующий только одну переменную.

Я пробовал это, но когда я выполнил функцию сериализатора (XmlSerializer xmlSerializer = new XmlSerializer(typeof(XML));), во время выполнения происходит сбой со следующим сообщением:

"Тамбыла ошибка, отражающая тип 'XMLSerializerTest.XML'. "

введите описание изображения здесь

Использование XmlChoiceIdentifier не сработало, но я 'Я новичок в обработке XML, поэтому может быть что-то не так. В конце я хочу получить один формат и иметь возможность перейти на другой формат. Я написал простой пример здесь, но я хочу распространить решение по всему проекту.

Это класс, который я создал:

namespace XMLSerializerTest
{
    [XmlType("XML", Namespace = "")]
    [XmlRoot("XML1")] //This doesn't handle multiple root names
    public class XML
    {
        [XmlElement("Name")]
        [XmlAttribute("Name1")]
        public string Name { get; set; }
    }
} 

Это то, что я делаю от Main допопробуйте и проверьте это:

//This is the line giving the error I mentioned 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(XML));
StreamReader sr = new StreamReader("[FileLocation.xml]");
//Do something to change to a diff "format"
XML xmltest = (XML)xmlSerializer.Deserialize(sr);
StreamWriter sw = new StreamWriter("Test1.xml");
sw.Close(); 

1 Ответ

0 голосов
/ 29 сентября 2019

Первый вариант:

XmlDocument document = new XmlDocument();
document.LoadXml("<XML><Name>Test</Name></XML>");
string NameValue = document.ChildNodes[0].ChildNodes[0].InnerText;

Второй вариант:

XmlDocument document = new XmlDocument();
document.LoadXml("<XML1 Name1=\"Test\"></XML1>");
string NameValue = document.ChildNodes[0].Attributes[0].Value;

Третий вариант:

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class XML1
{

    private string name1Field;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name1
    {
        get
        {
            return this.name1Field;
        }
        set
        {
            this.name1Field = value;
        }
    }
}

XmlSerializer serializer = new XmlSerializer(typeof(XML1));
using (StringReader reader = new StringReader("<XML1 Name1=\"Test\"></XML1>"))
{
     XML1 root = (XML1)(serializer.Deserialize(reader));
     string NameValue = root.Name1;
}

Четвертый вариант:

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class XML
{

    private string nameField;

    /// <remarks/>
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }
}

XmlSerializer serializer = new XmlSerializer(typeof(XML));
using (StringReader reader = new StringReader("<XML><Name>Test</Name></XML>"))
{
     XML root = (XML)(serializer.Deserialize(reader));
     string NameValue = root.Name;
}

Для последних двух вариантов есть небольшая хитрость, которая поможет вам автоматически создавать классы на основе вашего XML-файла. Если вы работаете над проектом .NET 4.5 (или новее), вы можете просто Специально Вставить ваш XML-файл как классы. 1. Скопируйте содержимое вашего XML-файла в буфер обмена.
2. В редакторе выберите место, куда вы хотите вставить ваши классы 3. В меню выберите РЕДАКТИРОВАТЬ> Специальная вставка> Вставить XML как классы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...