【问题标题】:Parsing XML Data (2,2)解析 XML 数据 (2,2)
【发布时间】:2014-08-15 22:39:28
【问题描述】:

我在尝试反序列化 XML 时遇到了一个独特的问题。

方法如下:

XmlSerializer serialize = new XmlSerializer(typeof(APIFile));
using(FileStream stream = new FileStream(file, FileMode.Open))
     using(XmlReader reader= XmlReader.Create(stream))
     {
          APIFile model = serialize.Deserialize(reader) as APIFile;
          Console.WriteLine(model.lSubmission.Select(m => m.Id));
     }

所以当代码到达model 时,我会收到一条错误消息:

  • xmlns="> Was not expected.
  • There is an error in XML document (2,2).

构建的模型是通过 Visual Studio 填充的编辑 -- 过去的特殊 -- XML 类

我篡改了以下行:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]

我已经修改了这一行:

  • 命名空间
  • xmlns
  • 删除了该行。
  • 从根属性更改

但错误仍然存​​在,我不完全确定原因。


<?xml version="1.0" encoding="UTF-8"?>
<CanvasResult>
     <TotalPages>8</TotalPages>
     <CurrentPage>1</CurrentPage>
     <Submissions>
          <Submission Id="5840790">
               <Form Id="718013">
                    <Name>Proof of Delivery</Name>
                    <Status>retired</Status>
                    <Version>6</Version>
               </Form>

这是 XML 的第一个小部分,之后是一些更小的内容/部分,将进一步扩展。 我的文档在文件中的任何地方都没有 xmlns,是否可能是 Reader 或 XmlSerializer 正在添加它?

【问题讨论】:

  • 您需要显示可能根本不是 XML 的 XML。
  • @AlexeiLevenkov 生成的模型来自第三方 XML Rest API;如果我添加该文件的内容,它会非常大。需要吗?
  • 虽然我不能代表其他人,但我主要对文件的前几行感兴趣。代码似乎在 XML 文档的开头出错了,所以我倾向于认为问题就在那里。
  • 文本xmlns="&gt;(来自错误)是否出现在文档的任何位置?
  • @Greg 感谢您添加 XML...但看起来它与您遇到错误的不同(第二行没有“xmlns”...)

标签: c# asp.net xml visual-studio rest


【解决方案1】:

我设法将问题隔离到几个方面:

  • 数据模型未处理所有插入的内容。
  • 第三方 API 在 XML 中传递了&amp;,这也导致了错误。

我编写了一个简单的验证方法,通过文件来验证 XML 并修复任何格式错误的标签或符号。

最终反序列化这些值的代码是:

    public static void ParseToModel(string file)
    {
        if (string.IsNullOrEmpty(file))
            throw new ArgumentNullException();

        XmlSerializer serialize = new XmlSerializer(typeof(CanvasResult));
        using(FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            using(XmlReader reader= XmlReader.Create(stream))
            {
                CanvasResult model = serialize.Deserialize(reader) as CanvasResult;
                ParseToDatabase(model);
            }
    }

调用该方法,该方法将获取文件参数,然后将内容与数据模型相关联。最后,它调用一个名为ParseToDatabase 的单独方法,该方法将内容分解并放入数据库中的适当列中。

【讨论】:

    【解决方案2】:

    我发现处理 xml 的最简单方法是使用 XDocuments / XElements ...

    using(var reader = StreamReader(new FileStream(file, FileMode.Open)))
    {
       var data = reader.ReadToEnd();
       var xml = new XElement(data);
       //TODO: query xml with linq or whatever
    }
    

    适用于整个文档和片段

    【讨论】:

    • 正在尝试自动化模型,使其更清洁,但如果我不能,我可能不得不走那条路。
    • 你说这个dom代表一个类型的数据?所以你需要反序列化到某个对象?
    • 1- serialize 有什么用 2- 您的 using stmt 不应以 ; 结尾 3- 没有 XElement 构造函数采用 stream 作为参数。这也可以像其他答案一样是评论。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2020-06-03
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多