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 包含对象列表,而不是单个对象。另一方面,属性名称 <Property ...>
与您的任何 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=''> 不是预期的的主要内容,如果未能解决你的问题,请参考以下文章