路径中的XML非法字符


71

我正在查询基于肥皂的服务,并希望分析返回的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);

这些-字符从哪里来?它是复制/粘贴错误还是在实际的XML中?
Oded

@Oded我想它们来自从VS的XML视图的IE复制和粘贴XML。
Ondrej Tucny 2010年

是的,我是从Visual Studio中的XMLVisualier中复制的
凯文,2010年

Answers:


227

您没有显示源代码,但是我想您正在做什么:

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);
}

事实上,在开发任何东西时,最好注意参数的语义(含义),而不仅仅是参数的类型。当参数的类型为a时,string这并不意味着只能输入字符串中的任何内容。

另外,在关于更新的问题,这是没有意义的使用XmlDocument,并XDocument在同一时间。选择一个或另一个。


2
谢谢回复。这可以将其加载到XMLDocument中,但是如果我尝试将XML加载到XDoc中以查询数据,我仍然会在路径中得到非法字符。有任何想法吗?字符串theXml = myGSM.get_competitions(“”,“”,1,“ en”,“是”); XmlDocument myDoc =新的XmlDocument(); myDoc.LoadXml(theXml); XDocument xDoc = XDocument.Load(myDoc.InnerXml);
凯文(Kevin)2010年

抱歉,第一次使用Stackoverflow,因此无法添加和格式化我的回复,如您所见!!!
凯文(Kevin)2010年

感谢您的全面解释,非常有用。但是,当我如上所述尝试您的建议时,我现在遇到以下错误,有什么想法吗?无法使用实例引用访问“ System.Xml.Linq.XDocument.Load(System.IO.TextReader)”;使用类型名称对其进行限定
凯文(Kevin)2010年

1
@Kevin Eh,对不起,我的错。正确的代码是doc = XDocument.Load(s)-请参阅更新。
Ondrej Tucny 2010年

如果您使用的是XML,则XDocument只需执行var doc = XDocument.Parse(xml)其中的一个字符串即可。
Dan Diplo

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方法则需要文件名。


3

为什么不

XDocument.Parse(theXml);

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


2

如果这确实是您的输出,则由于减号('-'),因此它是非法的XML。我怀疑您已从IE等浏览器中剪切并粘贴了此内容。您必须通过文本编辑器而不是浏览器显示确切的XML。


我已经从VS 2010中的XML Visualier中复制并粘贴了这些文件,这些只是为了扩展XML节点,不是吗?
凯文(Kevin)2010年

@Kevin在通过浏览器显示字符之后,几乎不可能调试它们。非法字符可能已转换为其他字符。我怀疑真正的原因离@Ondrej Tucny更近,但是了解确切的XML始终至关重要。例如在文档的开始的空间将是非法的,虽然你可能会得到不同的错误味精
peter.murray.rust

在线上有许多XML验证器-建议您将任何可疑XML粘贴到它们中,并获取错误消息。xmlvalidation.com是我的Google搜索中的第一个网站
peter.murray.rust
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.