我正在查询基于soap的服务,并希望分析返回的XML,但是当我尝试将XML加载到XDoc中以查询数据时。我收到'路径中的非法字符'错误消息?这(下面)是从服务返回的XML。我只是想获得比赛列表并将它们放入我已设置的列表中。 XML确实加载到XML文档中,但必须正确格式化?。
任何有关如何做到这一点并绕过错误的最佳方法的建议将不胜感激。
<?xml version="1.0" ?>
- <gsmrs version="2.0" sport="soccer" lang="en" last_generated="2010-08-27 20:40:05">
- <method method_id="3" name="get_competitions">
<parameter name="area_id" value="1" />
<parameter name="authorized" value="yes" />
<parameter name="lang" value="en" />
</method>
<competition competition_id="11" name="2. Bundesliga" soccertype="default" teamtype="default" display_order="20" type="club" area_id="80" last_updated="2010-08-27 19:53:14" area_name="Germany" countrycode="DEU" />
</gsmrs>
这是我的代码,我需要能够在XDoc中查询数据:
string theXml = myGSM.get_competitions("", "", 1, "en", "yes");
XmlDocument myDoc = new XmlDocument();
MyDoc.LoadXml(theXml);
XDocument xDoc = XDocument.Load(myDoc.InnerXml);
答案 0 :(得分:208)
您没有显示您的源代码,但我猜您正在做的是:
string xml = ... retrieve ...;
XmlDocument doc = new XmlDocument();
doc.Load(xml); // error thrown here
Load
方法要求文件名不是XML本身。要加载实际的XML,只需使用LoadXml
方法:
... same code ...
doc.LoadXml(xml);
同样,使用XDocument
Load(string)
方法需要文件名,而不是实际的XML。但是,没有LoadXml
方法,因此从字符串加载XML的正确方法是这样的:
string xml = ... retrieve ...;
XDocument doc;
using (StringReader s = new StringReader(xml))
{
doc = XDocument.Load(s);
}
事实上,在开发任何东西时,注意参数的语义(含义)不仅仅是它们的类型是一个非常好的主意。当参数类型为string
时,并不意味着只能输入任何字符串。
另外,就您的更新问题而言,同时使用XmlDocument
和XDocument
毫无意义。选择一个或另一个。
答案 1 :(得分:9)
跟进Ondrej Tucny的回答:
如果您想使用xml字符串,可以使用XElement,并调用“parse”方法。 (因为您的需求,XElement和XDocument将满足您的需求)
例如;
string theXML = '... get something xml-ish...';
XElement xEle = XElement.Parse(theXML);
// do something with your XElement
XElement的Parse方法允许您传入XML字符串,而Load方法需要文件名。
答案 2 :(得分:2)
如果这确实是你的输出,那么因为减号字符(' - ')它是非法的XML。我怀疑你已经从IE等浏览器剪切并粘贴了它。您必须从文本编辑器而不是浏览器中显示确切的XML。
答案 3 :(得分:1)
为什么不
XDocument.Parse(theXml);
我认为这将是正确的解决方案