C# 反序列化XML(不包括XmlRoot和命名空间),删除scehma
我有2个Xml,我想反序列化为1个类,因为innerxml是相同的,我想删除Scehma ie名称空间,并想在反序列化之前更改rootname XML 1C# 反序列化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
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抱歉,我只能继续你在最初的问题中提供的信息,你应该在最初的问题中披露所有相关信息,并且在给出示例时尽量接近真实代码——否则这只是一个猜测游戏。不管怎样,我想我的答案已经给了你一个核心问题的解决方案,剩下的就由你来做了。这就是我的问题所在,在新版本中,我的文件名也发生了变化。无论如何,非常感谢你的付出。