【问题标题】:Ampersand in XML url is not passed throughXML url 中的 & 符号未通过
【发布时间】:2013-10-30 23:57:37
【问题描述】:

我很难解决 url 中的与号 (&) 这个小问题...我正在序列化 XML,如下所示...

    var ser = new XmlSerializer(typeof(response));
    using (var reader = XmlReader.Create(url))
    {
        response employeeResults = (response)ser.Deserialize(reader); //<<error when i pass with ampersand
    }

如果 url 中没有 &amp;amp;,上述代码可以正常工作,否则会引发错误(见下文)

序列化这个 url 没有问题:

http://api.host.com/api/employees.xml/?&search=john

这个网址有问题:

http://api.host.com/api/employees.xml/?&max=20&page=10

我得到的错误是:

`There is an error in XML document (1, 389).`

PS:我确实尝试过传递&amp;#038;,也尝试过使用&amp;#38#026&amp;amp; - 没有运气。

【问题讨论】:

  • 显示 response 类声明和您尝试反序列化的整个 XML。
  • 你是在序列化还是反序列化?
  • 我已经更新了我的问题,请看一下

标签: c# .net xml xml-serialization xmlserializer


【解决方案1】:

此 XML 格式不正确:

<?xml version="1.0"?>
<response xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Api">
  <meta>
    <status>200</status>
    <message />
    <resultSet>
      <Checked>true</Checked>
    </resultSet>
    <pagination>
      <count>1</count>
      <page>1</page>
      <max>1</max>
      <curUri>http://api.host.com/employee.xml/?&max=5</curUri>
      <prevUri i:nil="true"/>
      <nextUri>http://api.host.com/employee.xml/?&max=5&page=2</nextUri>
    </pagination>
  </meta>
  <results i:type="ArrayOfemployeeItem">
    <empItem>
      <Id>CTR3242</Id>
      <name>john</name>
      ......
    </empItem>
  </results>
</response>

您必须转义&amp;amp; 字符或将整个字符串放入CDATA,例如:

<?xml version="1.0"?>
<response xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Api">
  <meta>
    <status>200</status>
    <message />
    <resultSet>
      <Checked>true</Checked>
    </resultSet>
    <pagination>
      <count>1</count>
      <page>1</page>
      <max>1</max>
      <curUri><![CDATA[http://api.host.com/employee.xml/?&max=5]]></curUri>
      <prevUri i:nil="true"/>
      <nextUri><![CDATA[http://api.host.com/employee.xml/?&max=5&page=2]]></nextUri>
    </pagination>
  </meta>
  <results i:type="ArrayOfemployeeItem">
    <empItem>
      <Id>CTR3242</Id>
      <name>john</name>
      ......
    </empItem>
  </results>
</response>

如果您正在处理一些第三方系统并且无法获得正确的 XML 响应,则必须进行一些预处理。

也许最简单的方法就是使用string.Replace 方法将所有&amp;amp; 替换为&amp;amp;

或使用此正则表达式&amp;(?!amp;) 替换所有&amp;amp;,不包括正确的&amp;amp;

【讨论】:

  • 在反序列化之前替换&amp;amp;?我该怎么做?我收到var reader = xmlreader.create(url)
  • @AbuHamzah,使用WebClient.DownloadStringmsdn.microsoft.com/en-us/library/ms144200.aspx以字符串形式回复您
  • 所以在 xml 中有 & 符号是一件坏事吗?是否有任何网站或博客告诉 xml 中不允许的内容会很棒,这样我就可以告诉人们不要提供任何 xml 不喜欢的字符。 - 谢谢。
  • +1 (在“无效 XML”上进行任何类型的字符串替换以使其格式良好通常是个坏主意,强制格式良好的 XML 要好得多)。 XML specification 是查找 XML 规范的最佳位置。请参阅来自stackoverflow.com/questions/1328538/… 的参考资料
【解决方案2】:

您是否尝试使用 &lt;![CDATA[yourAttribute]]&gt; 包装属性? & 不允许在 xml 中使用

deserialize-xml-with-ampersand-using-xmlserializer

【讨论】:

  • 在反序列化之前你会在哪里换行?
  • 也许您可以在反序列化之前预处理数据以删除 &?
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2013-02-02
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多