【问题标题】:Trying to parse xml, but xmldocument.loadxml() is trying to download?试图解析 xml,但 xmldocument.loadxml() 正在尝试下载?
【发布时间】:2011-01-28 19:34:48
【问题描述】:

我有一个字符串输入,我不知道它是否是有效的 xml。

我认为最简单的方法是包装

new XmlDocument().LoadXml(strINPUT);

在 try/catch 中。

我面临的问题是,有时strINPUT是一个html文件,如果这个文件的头包含

<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">
<html xml:lang=""en-GB"" xmlns=""http://www.w3.org/1999/xhtml"" lang=""en-GB"">

...像许多人一样,它实际上试图连接到 w3.org url,我真的不希望它这样做。

任何人都知道是否有可能只解析字符串而不试图变得聪明并检查外部网址?如果做不到这一点,还有xmldocument 的替代品吗?

【问题讨论】:

    标签: c# xml parsing


    【解决方案1】:

    尝试以下方法:

    XmlDocument doc = new XmlDocument();
    using (var reader = XmlReader.Create(new StringReader(xml), new XmlReaderSettings() {
        ProhibitDtd = true,
        ValidationType = ValidationType.None
    })) {
        doc.Load(reader);
    }
    

    代码创建了一个关闭 DTD 处理和验证的阅读器。检查格式是否正确仍然适用。

    如果您可以切换到使用 XDocument 而不是 XmlDocument,您也可以使用 XDocument.Parse

    【讨论】:

      【解决方案2】:

      我不确定问题背后的原因,但是您是否尝试过 System.Xml.Linq 中的 XDocumentXElement

       XDocument document = XDocument.Load(strINPUT , LoadOptions.None);
       XElement element = XElement.Load(strINPUT );
      

      编辑: xml 为 string 尝试关注

      XDocument document = XDocument.Parse(strINPUT , LoadOptions.None );
      

      【讨论】:

      • 是的 :( 使用 etherreal 我可以看到它正在尝试连接。
      • 连接背后的原因是 LoadXML 或 Load 函数尝试从指定位置检索 DTD。这是正常解析过程的一部分。
      • 当然,但他愿意接受alternative!!。看问题的最后一行!
      【解决方案3】:

      使用 XmlDocument 的 load 方法加载 xml 文档,使用 XmlNodeList 获取元素,然后检索数据... 尝试以下方法:

      XmlDocument xmlDoc = new XmlDocument();
      //use the load method to load the XML document from the specified stream.
      xmlDoc.Load("myXMLDoc.xml");
      //Use the method GetElementsByTagName() to get elements that match the specified name.
      XmlNodeList item = xDoc.GetElementsByTagName("item");
      XmlNodeList url = xDoc.GetElementsByTagName("url"); 
      Console.WriteLine("The item is: " + item[0].InnerText));
      

      在上面的代码周围添加一个 try/catch 块,看看你捕捉到了什么,修改你的代码来解决这种情况。

      【讨论】:

      • 没有解决OP中的问题!您的代码也会在 xmlDoc.Load("xmlfile"); 上失败。
      • 感谢您的贡献,但这不是问题所在。 op 正在努力不让对象连接到 xml 中的 uri。
      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2020-01-04
      • 2018-03-02
      相关资源
      最近更新 更多