我正在努力修复网址中的&符号(&)这个小问题...我正在按如下所示序列化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:我确实尝试过&
并尝试使用&
或#026
或&
- 没有运气。
答案 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响应,则必须进行一些预处理。
也许最简单的方法就是使用&
方法将所有&
替换为string.Replace
。
或者使用此正则表达式&(?!amp;)
替换所有&
,不包括&
等正确的{{1}}。
答案 1 :(得分:1)
您是否尝试使用<![CDATA[yourAttribute]]>
打包属性?
&安培;在xml中不允许