XML 反序列化 System.InvalidOperationException” <Objects xmlns=''> 不是预期的

Posted

技术标签:

【中文标题】XML 反序列化 System.InvalidOperationException” <Objects xmlns=\'\'> 不是预期的【英文标题】:XML deserialization System.InvalidOperationException” the <Objects xmlns=''> was not expectedXML 反序列化 System.InvalidOperationException” <Objects xmlns=''> 不是预期的 【发布时间】:2021-03-23 07:39:00 【问题描述】:

两天后我无法反序列化 XML 文件。我尝试了很多不同的想法,但仍然没有成功。当我在 1、40 上反序列化名为 phone.xml 的 xml 文件时出现错误。我认为这可能是在带有 [XmlElement("id")] 的括号中缺少命名空间的问题,但缺口发生了变化。我复制了不同的反序列化想法。没有成功。此外,我什至无法使用任何转换器转换此 xml,但我确信它是正确的。帮助

链接内xml结构的jpeg示例

using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;


public class OrderedItem

    [XmlElement("id")]
    public string id;
    [XmlElement("username")]
    public string username;
    [XmlElement("phoneType")]
    public string phoneType;
    [XmlElement("value")]
    public string value;


public class Program

    public static void Main()
    
        Program t = new Program();

        t.DeserializeObject("phone.xml");
    

    private void DeserializeObject(string filename)
    
        Console.WriteLine("Reading with TextReader");

        XmlSerializer serializer =
        new XmlSerializer(typeof(OrderedItem));

        FileStream fs = new FileStream(filename, FileMode.OpenOrCreate);
        TextReader reader = new StreamReader(fs);

        OrderedItem i;


    i = (OrderedItem)serializer.Deserialize(reader);

        Console.Write(
            i.id + "\t" +
            i.username + "\t" +
            i.phoneType + "\t" +
            i.value + "\t");
    

XML 示例

  <?xml version="1.0" encoding="utf-8"?>
  <Objects>
    <Object>
      <Property Name="id"></Property>
      <Property Name="username">JLOCK0</Property>
      <Property Name="phoneType">phone1</Property>
      <Property Name="value">346-209-9609</Property>
    </Object>
    <Object>
      <Property Name="id"></Property>
      <Property Name="username">JLOCK0</Property>
      <Property Name="phoneType">phone2</Property>
      <Property Name="value">(478) 8085400</Property>
    </Object>
  </Objects>

【问题讨论】:

是的。您应该尝试将您的OrderedItem 序列化为 XML,您会看到结果与您当前的 XML 不匹配 - 实际上它们应该完全不同。请参阅:dotnetfiddle.net/7RZj5A。一方面,XML 包含对象列表,而不是单个对象。另一方面,属性名称 &lt;Property ...&gt; 与您的任何 c# 属性名称都不对应。 @dbc 问题是我无法序列化它。我的意思是我会得到这样的缺少东西的数据,我必须按原样使用 好的。这不是答案,只是评论。评论的重点是,您可以通过序列化和比较您编写的内容与您需要阅读的内容来调试de序列化问题。 路径“phone.xml”指向当前应用程序文件夹。检查项目输出目录中同名的文件是否正确。 【参考方案1】:
public class Objects

    [XmlElement("Object")]
    public OrderedItem[] Items;


public class OrderedItem

    [XmlElement("Property")]
    public Property[] Properties;


public class Property

    [XmlAttribute]
    public string Name  get; set; 
    [XmlText]
    public string Value  get; set; 

var serializer = new XmlSerializer(typeof(Objects));

using (var fs = new FileStream(filename, FileMode.Open))

    var objects = (Objects)serializer.Deserialize(fs);

    foreach (var item in objects.Items)
    
        foreach (var prop in item.Properties)
        
            Console.WriteLine(prop.Name + " " + prop.Value);
        
        Console.WriteLine();
    

【讨论】:

我遵循了上面的建议,但仍然得到一个异常 1,40 > XmlException: Name cannot begin with the '.'字符,十六进制值 0x00。第 1 行,位置 40。 @Asumuri - 此代码适用于您的 xml。期间。 我从这里复制了示例 xml,我得到了同样的错误。我发现它可能与编码有关,但不确定必须添加什么 @Asumuri - 编码直接在 xml: utf-8 中指定。以这种编码保存文件。 当我将编码更改为 utf-16 时,一切正常,但是在代码中做什么或如何从代码角度重写 XML 以读取这样的文件

以上是关于XML 反序列化 System.InvalidOperationException” <Objects xmlns=''> 不是预期的的主要内容,如果未能解决你的问题,请参考以下文章

GolangGo 语言 XML 的序列与反序列化实践

GolangGo 语言 XML 的序列与反序列化实践

GolangGo 语言 XML 的序列与反序列化实践

在C#中序列化和反序列化之间保留xml元素的顺序

反序列化 XML 并在 XML 文档中出错 (2, 2)

C# Xml 反序列化错误