C# 反序列化XML(不包括XmlRoot和命名空间),删除scehma

C# 反序列化XML(不包括XmlRoot和命名空间),删除scehma,c#,xml,visual-studio,serialization,C#,Xml,Visual Studio,Serialization,我有2个Xml,我想反序列化为1个类,因为innerxml是相同的,我想删除Scehma ie名称空间,并想在反序列化之前更改rootname XML 1 xml1hi XML 2 xml1hi 课程 [System.Xml.Serialization.XmlRoot("GenericXMLClass", IsNullable=true)] public partial class GenericXMLClass { public string element1 {get;set

我有2个Xml,我想反序列化为1个类,因为innerxml是相同的,我想删除Scehma ie名称空间,并想在反序列化之前更改rootname

XML 1


xml1hi

XML 2


xml1hi

课程

[System.Xml.Serialization.XmlRoot("GenericXMLClass", IsNullable=true)]
public partial class GenericXMLClass
{
    public string element1 {get;set;}
}
//RemoveNameSpaces
    public class NamespaceIgnorantXmlTextReader : XmlTextReader
    {
        public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader) : base(reader) { }

        public override string NamespaceURI
        {
            get { return ""; }
        }
    }
    //RemoveNameSpaces
    public class XTWFND : XmlTextWriter
    {
        public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
        public override void WriteStartDocument() { }
    }

    //Generate Generic XML Files
    public GenericXMLCLass GenericXmlGenerator()
    {
        var xDocument = XDocument.Load(@"myxml.xml"); 
        string xmlString = xDocumnet.ToString();
        GenericXMLCLass genericXML = new GenericXMLCLass();
        String xml;
            XmlDocument objDoc = new XmlDocument();
            objDoc.LoadXml(xmlString);
            XmlDocument objNewDoc = new XmlDocument();
            XmlElement objNewRoot = objNewDoc.CreateElement("GenericXMLClass");
            objNewDoc.AppendChild(objNewRoot);
            objNewRoot.InnerXml = objDoc.DocumentElement.InnerXml;

            xml = objNewDoc.OuterXml;

                var serializer2 = new XmlSerializer(typeof(GenericXMLClass));
                var reader = new StringReader(xml);
                var instance = (GenericXMLClass)serializer2.Deserialize(new NamespaceIgnorantXmlTextReader(reader));
                genericXML = instance;

        }
        return genericXML;
    }
[System.Xml.Serialization.XmlRoot(“MyXMLTest”,IsNullable=true)]
公共部分类MyXMLTest{
公共字符串元素1{get;set;}
}

方法

var xDocument=xDocument.Load(@“myxml.xml”);字符串myxmlstring=xDocumnet.ToString();
var reader=newstringreader(myxmlstring);
var serializer=新的XmlSerializer(typeof(MyXMLTest));
var实例=(MyXMLTest)序列化程序。反序列化(读取器);
//我在最后一行中遇到了意外错误

然后,我如何忽略任何上传的Xml的名称空间和根名称


谢谢

鉴于您在这里所做的似乎是对XML片段进行反序列化,也许您应该考虑使用
XElement
,它在解析XML方面做得很好,而不考虑名称空间/根名称等

var xml = "<MyXMLTest1 xsi:schemaLocation='abc1' xmlns:xsi='abc12' xmlns='abc123'><element1>xml1hi</element1></MyXMLTest1>";
var xmlTest = new MyXMLTest
{
    element1 = XElement.Parse(xml).Value
};
Console.WriteLine(xmlTest.element1); // outputs "xml1hi"

最后我想出了解决这个问题的办法

我所做的是

  • 我编写了一个方法来更改/覆盖每个传入XML的根名称
  • 删除名称空间的步骤
然后使用它们

示例如下:

希望有人会觉得它有用

课程

[System.Xml.Serialization.XmlRoot("GenericXMLClass", IsNullable=true)]
public partial class GenericXMLClass
{
    public string element1 {get;set;}
}
//RemoveNameSpaces
    public class NamespaceIgnorantXmlTextReader : XmlTextReader
    {
        public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader) : base(reader) { }

        public override string NamespaceURI
        {
            get { return ""; }
        }
    }
    //RemoveNameSpaces
    public class XTWFND : XmlTextWriter
    {
        public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
        public override void WriteStartDocument() { }
    }

    //Generate Generic XML Files
    public GenericXMLCLass GenericXmlGenerator()
    {
        var xDocument = XDocument.Load(@"myxml.xml"); 
        string xmlString = xDocumnet.ToString();
        GenericXMLCLass genericXML = new GenericXMLCLass();
        String xml;
            XmlDocument objDoc = new XmlDocument();
            objDoc.LoadXml(xmlString);
            XmlDocument objNewDoc = new XmlDocument();
            XmlElement objNewRoot = objNewDoc.CreateElement("GenericXMLClass");
            objNewDoc.AppendChild(objNewRoot);
            objNewRoot.InnerXml = objDoc.DocumentElement.InnerXml;

            xml = objNewDoc.OuterXml;

                var serializer2 = new XmlSerializer(typeof(GenericXMLClass));
                var reader = new StringReader(xml);
                var instance = (GenericXMLClass)serializer2.Deserialize(new NamespaceIgnorantXmlTextReader(reader));
                genericXML = instance;

        }
        return genericXML;
    }
功能

[System.Xml.Serialization.XmlRoot("GenericXMLClass", IsNullable=true)]
public partial class GenericXMLClass
{
    public string element1 {get;set;}
}
//RemoveNameSpaces
    public class NamespaceIgnorantXmlTextReader : XmlTextReader
    {
        public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader) : base(reader) { }

        public override string NamespaceURI
        {
            get { return ""; }
        }
    }
    //RemoveNameSpaces
    public class XTWFND : XmlTextWriter
    {
        public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
        public override void WriteStartDocument() { }
    }

    //Generate Generic XML Files
    public GenericXMLCLass GenericXmlGenerator()
    {
        var xDocument = XDocument.Load(@"myxml.xml"); 
        string xmlString = xDocumnet.ToString();
        GenericXMLCLass genericXML = new GenericXMLCLass();
        String xml;
            XmlDocument objDoc = new XmlDocument();
            objDoc.LoadXml(xmlString);
            XmlDocument objNewDoc = new XmlDocument();
            XmlElement objNewRoot = objNewDoc.CreateElement("GenericXMLClass");
            objNewDoc.AppendChild(objNewRoot);
            objNewRoot.InnerXml = objDoc.DocumentElement.InnerXml;

            xml = objNewDoc.OuterXml;

                var serializer2 = new XmlSerializer(typeof(GenericXMLClass));
                var reader = new StringReader(xml);
                var instance = (GenericXMLClass)serializer2.Deserialize(new NamespaceIgnorantXmlTextReader(reader));
                genericXML = instance;

        }
        return genericXML;
    }

MyXMLTest1和MyXMLTest2与类名MyXMLTest不匹配。序列化程序可能需要一个节点。@Dietz是的,输入xml可以有任何名称,因此我想用我自己的名称来表示xml的根名称。该xml只是一个示例,有100个元素,因此我认为提及它们不是一个好主意。另外,我在xml和xmlclass@ArijitMukherjee如果有多个元素,那么您可以将每个元素作为一个新的
MyXMLTest
实例进行投影(请参见更新)。James,我的XMLTest类也可以是另一个类对象。像
public-XMLTEST{public-string-element1{get;set;}public-mymessages{all-messages{get;set;}}
希望我说清楚。@ArijitMukherjee抱歉,我只能继续你在最初的问题中提供的信息,你应该在最初的问题中披露所有相关信息,并且在给出示例时尽量接近真实代码——否则这只是一个猜测游戏。不管怎样,我想我的答案已经给了你一个核心问题的解决方案,剩下的就由你来做了。这就是我的问题所在,在新版本中,我的文件名也发生了变化。无论如何,非常感谢你的付出。