XML中的非法字符

问题描述:

我正在查询基于soap的服务,并希望分析返回的XML,但是当我尝试将XML加载到XDoc中以查询数据时。我得到'路径中的非法字符'错误信息?这(下面)是从服务返回的XML。我只想获得比赛名单,并将它们放入我设置的名单中。 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

那些人在那里'-'字符来自哪里?它是复制/粘贴错误还是它在实际的XML? – Oded 2010-10-30 08:48:22

+0

@Oded我想他们来自VS的XML视图的IE复制和粘贴XML。 – 2010-10-30 08:50:11

+0

是的,我从Visual Studio中的XMLVisualier复制 – Kevin 2010-10-30 09:04:38

你不显示你的源代码,但我猜你在做什么是这个:

string xml = ... retrieve ...; 
XmlDocument doc = new XmlDocument(); 
doc.Load(xml); // error thrown here 

Load方法需要文件名不是XML本身。加载一个实际的XML,只需使用方法LoadXml

... same code ... 
doc.LoadXml(xml); 

类似地,使用该XDocumentLoad(string)方法需要一个文件名,并非实际XML。然而,没有LoadXml方法,所以从字符串加载XML的正确的方法是这样的:

string xml = ... retrieve ...; 
XDocument doc; 
using (StringReader s = new StringReader(xml)) 
{ 
    doc = XDocument.Load(s); 
} 

由于事实上开发任何东西的时候,这是要注意的语义一个非常好的主意(含义)参数不只是它们的类型。当参数的类型是string时,并不意味着只能输入任何字符串。

此外,就您更新的问题而言,同时使用XmlDocumentXDocument是没有意义的。选择一个或另一个。

+2

感谢您的回复。这可以将其加载到XMLDocument中,但如果我尝试将此XML加载到XDoc中以查询数据,我仍然会收到路径中的非法字符。有任何想法吗? string theXml = myGSM.get_competitions(“”,“”,1,“en”,“yes”); XmlDocument myDoc = new XmlDocument(); myDoc.LoadXml(theXml); XDocument xDoc = XDocument.Load(myDoc.InnerXml); – Kevin 2010-10-30 09:02:53

+0

对不起,第一次使用*,所以无法添加和格式化我的回复,正如你所看到的! – Kevin 2010-10-30 09:03:30

+0

@凯文见我更新的答案。 – 2010-10-30 09:09:26

如果这实际上是您的输出,由于减号字符(' - '),它是非法的XML。我怀疑你已经从IE等浏览器中剪切并粘贴了它。您必须从文本编辑器中显示确切的XML,而不是浏览器。

+0

我已经从VS 2010中的XML Visualier中复制和粘贴这些只是为了展开XML节点吗? – Kevin 2010-10-30 09:07:39

+0

@Kevin在通过浏览器显示后调试字符几乎是不可能的。非法角色可能已经转化为别的东西。我怀疑真正的原因更接近@Ondrej Tucny,但知道确切的XML总是非常重要的。例如,文档开头处的空格将是非法的,尽管您可能会得到不同的错误信息msg – 2010-10-30 09:25:15

+0

非常感谢这些信息@ peter.murray.rust我将来会记住这一点。祝一切顺利。 – Kevin 2010-10-30 09:35:58

上的Ondrej Tucny的答案随访:

如果你想使用XML字符串,而不是,您可以使用的XElement,并称之为“解析”的方法。 (由于您的需要,XElement和XDocument将满足您的需求)

例如;

string theXML = '... get something xml-ish...'; 
XElement xEle = XElement.Parse(theXML); 

// do something with your XElement 

的的XElement的解析方法,可以让你在一个XML字符串传递,而Load方法需要一个文件名。

+0

谢谢@哈维达维这是有帮助的 – abhi 2013-08-15 20:39:35

为什么不

XDocument.Parse(theXml); 

我认为这将是正确的解决方案