Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将XML文件从给定标记解析为对象_C#_Xml_Deserialization_Xml Deserialization - Fatal编程技术网

C#将XML文件从给定标记解析为对象

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

我有一个xml文件,我想将数据集封装到另一个标记中,因此当我尝试解析它时,由于意外的成员,它当然会抛出InvalidOperationException

我试过阅读各种关于xml的MS文档,也试过用谷歌搜索我的问题,但我找不到不费吹灰之力如何解决它

我的代码:

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(读取器)