XML url中的&符号未通过

时间:2013-10-30 23:57:37

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

我正在努力修复网址中的&符号(&)这个小问题...我正在按如下所示序列化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
    }

如果网址中没有&,则上述代码可以正常工作,否则会引发错误(请参阅下文)

序列化此网址没有问题:

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:我确实尝试过&#038;并尝试使用&#38#026&amp; - 没有运气。

2 个答案:

答案 0 :(得分:4)

此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>

您必须转义&字符或将整个字符串放入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响应,则必须进行一些预处理。

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

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

答案 1 :(得分:1)

您是否尝试使用<![CDATA[yourAttribute]]>打包属性? &安培;在xml中不允许

deserialize-xml-with-ampersand-using-xmlserializer