C#将XML文件从给定标记解析为对象
我有一个xml文件,我想将数据集封装到另一个标记中,因此当我尝试解析它时,由于意外的成员,它当然会抛出InvalidOperationException 我试过阅读各种关于xml的MS文档,也试过用谷歌搜索我的问题,但我找不到不费吹灰之力如何解决它 我的代码:C#将XML文件从给定标记解析为对象,c#,xml,deserialization,xml-deserialization,C#,Xml,Deserialization,Xml Deserialization,我有一个xml文件,我想将数据集封装到另一个标记中,因此当我尝试解析它时,由于意外的成员,它当然会抛出InvalidOperationException 我试过阅读各种关于xml的MS文档,也试过用谷歌搜索我的问题,但我找不到不费吹灰之力如何解决它 我的代码: public static ClassToDeserialize GetObjectFromXml (string path) { XmlSerializer xmlSerializer = new XmlSeri
public static ClassToDeserialize GetObjectFromXml (string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ClassToDeserialize));
System.IO.FileStream file = System.IO.File.OpenRead(path);
ClassToDeserialize loadedObjectXml = xmlSerializer.Deserialize(file) as ClassToDeserialize;
return loadedLicenseXml;
}
那么,我如何告诉这个程序只从一个特定的标记开始反序列化,因为该标记包含对象的相关xml数据呢?您可以尝试读取xml直到找到节点,然后检索它的外部xml并将其放入
XmlSerializer
。假设您有一个简单的XML文件,如下所示:
<rootnode>
<!-- some nodes inside -->
<uselessNode>
<thatsWhatIWant>
<!-- some fields inside -->
<uselessNodeInside/>
<usefullNodeInside/>
</thatsWhatIWant>
</uselessNode>
</rootnode>
然后读取POI的内容,并将其存储在某个变量中:
string wantedNodeContents = string.Empty;
while (reader.Read())
{
if(reader.NodeType == XmlNodeType.Element && reader.Name == "thatsWhatIWant")
{
wantedNodeContents = reader.ReadOuterXml();
break;
}
}
有了这些,您应该能够像这样使用XmlSerializer
:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ClassToDeserialize));
System.IO.TextReader textReader = System.IO.StringReader(wantedNodeContents);
ClassToDeserialize loadedObjectXml = xmlSerializer.Deserialize(textReader) as ClassToDeserialize;
您也可以(或除此之外)尝试为UnknownNode
和unknownnattribute
添加一些处理程序:
xmlSerializer.UnknownNode+= new XmlNodeEventHandler(UnknownNode);
xmlSerializer.UnknownAttribute+= new XmlAttributeEventHandler(UnknownAttribute);
void UnknownNode(object sender, XmlNodeEventArgs e) { }
void UnknownAttribute(object sender, XmlAttributeEventArgs e) { }
您可以尝试读取Xml,直到找到节点为止,然后检索它的外部Xml并将其放入
XmlSerializer
。假设您有一个简单的XML文件,如下所示:
<rootnode>
<!-- some nodes inside -->
<uselessNode>
<thatsWhatIWant>
<!-- some fields inside -->
<uselessNodeInside/>
<usefullNodeInside/>
</thatsWhatIWant>
</uselessNode>
</rootnode>
然后读取POI的内容,并将其存储在某个变量中:
string wantedNodeContents = string.Empty;
while (reader.Read())
{
if(reader.NodeType == XmlNodeType.Element && reader.Name == "thatsWhatIWant")
{
wantedNodeContents = reader.ReadOuterXml();
break;
}
}
有了这些,您应该能够像这样使用XmlSerializer
:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ClassToDeserialize));
System.IO.TextReader textReader = System.IO.StringReader(wantedNodeContents);
ClassToDeserialize loadedObjectXml = xmlSerializer.Deserialize(textReader) as ClassToDeserialize;
您也可以(或除此之外)尝试为UnknownNode
和unknownnattribute
添加一些处理程序:
xmlSerializer.UnknownNode+= new XmlNodeEventHandler(UnknownNode);
xmlSerializer.UnknownAttribute+= new XmlAttributeEventHandler(UnknownAttribute);
void UnknownNode(object sender, XmlNodeEventArgs e) { }
void UnknownAttribute(object sender, XmlAttributeEventArgs e) { }
我想您应该使用
XmlReader
打开XML文件,然后检查所有标记,直到找到所需的标记。然后,您可以使用相同的XmlReader
来反序列化所需的数据,或者只从该节点获取OuterXml
,并使用XmlSerializer
使用XML Reader对其进行反序列化,然后您可以使用readto方法来获取所需的标记:System.XML.XmlReader=System.XML.Create(file);reader.ReadToFollowing(标签);xmlSerializer.Deserialize(reader)imo您应该使用XmlReader
打开XML文件,然后遍历所有标记,直到找到所需的标记。然后,您可以使用相同的XmlReader
来反序列化所需的数据,或者只从该节点获取OuterXml
,并使用XmlSerializer
使用XML Reader对其进行反序列化,然后您可以使用readto方法来获取所需的标记:System.XML.XmlReader=System.XML.Create(file);reader.ReadToFollowing(标签);xmlSerializer.Deserialize(读取器)