【问题标题】: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”指向当前应用程序文件夹。检查项目输出目录中同名的文件是否正确。

标签: c# xml deserialization


【解决方案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 以读取这样的文件
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
相关资源
最近更新 更多