我从Web API的控制器收到一个XML字符串,其构造如下所示:
private string CreateXDoc(IEnumerable<PassedJSONConverted> passed)
{
XNamespace xmlns = "http://host.adp.com";
var doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
var jobListElement = new XElement(xmlns + "JobXML");
foreach (var objectItem in passed)
{
var loopElement = new XElement(xmlns + "JobsXML", new XElement(xmlns + "ID", objectItem.ID.ToString()), new XElement(xmlns + "Name", objectItem.Name), new XElement(xmlns + "Age", objectItem.Age.ToString()), new XElement(xmlns + "JobTitle", objectItem.JobTitle), new XElement(xmlns + "StartDate", objectItem.StartDate));
jobListElement.Add(loopElement);
}
doc.Add(jobListElement);
//Format without \n's
return doc.ToString(SaveOptions.DisableFormatting);
}
这很好,XML的设置如下所示:
- <JobXML xmlns="http://host.xxx.com">
- <JobsXML>
<ID>1</ID>
<Name>Dave</Name>
<Age>23</Age>
<JobTitle>Developer</JobTitle>
<StartDate>10/24/2013 6:40:28 AM</StartDate>
</JobsXML>
- <JobsXML>
<ID>2</ID>
<Name>John</Name>
<Age>44</Age>
<JobTitle>QA</JobTitle>
<StartDate>10/24/2013 6:40:28 AM</StartDate>
</JobsXML>
- <JobsXML>
<ID>3</ID>
<Name>Dave</Name>
<Age>23</Age>
<JobTitle>Senior Developer</JobTitle>
<StartDate>10/24/2013 6:40:28 AM</StartDate>
</JobsXML>
</JobXML>
然后我将其作为字符串返回并尝试将其解析回xDoc,如下所示:
private static string HandleResponse(HttpWebResponse httpResponse)
{
using (var responseReader = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
{
string responsePayload = responseReader.ReadToEnd();
var newxDoc = XDocument.Parse(responsePayload);
return responsePayload;
}
}
运行时字符串'responsePayLoad'设置如下:
"<JobXML xmlns=\"http://host.adp.com\"><JobsXML><ID>1</ID><Name>Dave</Name><Age>23</Age><JobTitle>Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>2</ID><Name>John</Name><Age>44</Age><JobTitle>QA</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>3</ID><Name>Dave</Name><Age>23</Age><JobTitle>Senior Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML></JobXML>"
这给了我一个例外的'newxDoc'对象:
XmlException未处理。根级别的数据无效。第1行,第1位。
谁能告诉我哪里出错?
答案 0 :(得分:4)
问题是您的responsePayLoad字符串不是有效的XML。
你的问题在这里:
"<JobXML xmlns=\"http://host.adp.com\">
字符串开头和结尾的引号字符以及引号前面的反斜杠导致XML格式错误。如果您的字符串在开头和结尾没有这些引号,那么XML将是有效的,即这将使XML格式良好:
<JobXML xmlns="http://host.adp.com">...<\JobXML>
至于为什么会出现此问题,可能是因为您创建XDocument的方式。 Microsoft文档here中的示例表明,应使用以下构造函数实例化使用特定XDeclaration的XDocument:
XDocument(XDeclaration, Object[])
因此,我会尝试重新分解您的代码以使我们使用此方法,例如
private string CreateXDoc(IEnumerable<PassedJSONConverted> passed)
{
XNamespace xmlns = "http://host.adp.com";
var xdec = new XDeclaration("1.0", "utf-8", "yes");
var jobListElement = new XElement(xmlns + "JobXML");
foreach (var objectItem in passed)
{
var jobXml = new XElement(xmlns + "JobsXML",
new XElement(xmlns + "ID", objectItem.ID.ToString()),
new XElement(xmlns + "Name", objectItem.Name),
new XElement(xmlns + "Age", objectItem.Age.ToString()),
new XElement(xmlns + "JobTitle", objectItem.JobTitle),
new XElement(xmlns + "StartDate", objectItem.StartDate));
jobListElement.Add(jobXml);
}
var doc = new XDocument(
xdec,
new XElement(jobListElement)
);
//Format without new lines
return doc.ToString(SaveOptions.DisableFormatting);
}
如果这不起作用,请尝试关闭CreateXDoc中的禁用格式化。
return doc.ToString();
答案 1 :(得分:1)
尝试添加&lt;?xml version =“1.0”encoding =“UTF-8”?&gt;到XML String的开头。
不要担心转义引号,它们就在那里,因为XML是用字符串包装的。
答案 2 :(得分:0)
以上两个答案相结合将把它整理出来
当我重复xml脚本时,我收到了此错误
XML解析错误:格式不正确 位置:Untitled-1.xml 第2行,第15栏: HTTP://host.adp.com \“&GT; 1Dave23 -------------- ^ Developer10 / 24/2013 6:45:22 AM2John44QA10 / 24/2013 6:45:22 AM3Dave23Senior Developer10 / 24/2013 6:45:22 AM
这是正确的表格
<?xml version="1.0" encoding="utf-8"?>
<JobXML xmlns="http://host.adp.com\"><JobsXML><ID>1</ID><Name>Dave</Name><Age>23</Age><JobTitle>Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>2</ID><Name>John</Name><Age>44</Age><JobTitle>QA</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>3</ID><Name>Dave</Name><Age>23</Age><JobTitle>Senior Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML></JobXML>
答案 3 :(得分:0)
正如您所问,将XML字符串解析为xdocument:
只需尝试此代码
XDocument document = XDocument.Parse(xml);
但我有一个问题,如果这对于巨大的xml字符串有好处,例如xml中有一行以上的千行代码。 我已经尝试过这个方法用于一个包含10000行代码的xml文档,花了1.5秒