繁体   English   中英

XML 文件 - 两个版本 - 相同数据 - 元素属性 + 名称更改

[英]XML File - Two versions - Same data - Attribute to Element + name change

我将收到这两个 xml

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

或者

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

我想知道是否有一种方法可以仅使用一个变量来处理元素“Name”和属性“Name1”的值。

我试过这个,但是当我执行序列化程序 function ( XmlSerializer xmlSerializer = new XmlSerializer(typeof(XML)); ) 它在运行时失败并显示以下消息:

“反映类型 'XMLSerializerTest.XML' 时出现错误。”

在此处输入图像描述

使用XmlChoiceIdentifier不起作用,但我是处理 XML 的新手,所以可能有问题。 最后我想做的是接收一种格式并能够更改为另一种格式。 我在这里写了一个简单的例子,但我想在整个项目中传播解决方案。

这是我创建的 class:

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(); 

第一个选项:

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. 在编辑器中,select 放置您希望粘贴类的位置 3. 从菜单中,select 编辑> 选择性粘贴 > 粘贴 XML 为类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM