为什么我的XML文档中找不到XElements?

时间:2014-06-08 09:36:41

标签: c# xml linq linq-to-xml

我知道这是一个反复出现的问题,但我的回答并没有真正帮助过。我正在尝试使用C#使用Classify API获取一本书的详细信息。它提供XML输出,如:

<classify xmlns="http://classify.oclc.org">
    <response code="2"/>
    <!--
        Classify is a product of OCLC Online Computer Library Center: http://classify.oclc.org
    -->
    <work author="Coelho, Paulo | Clarke, Alan [Author; Translator] | Sampere, Daniel, 1985- [Illustrator; Draftsman] | Lemmens, Harrie, 1953- [Translator] | Smith, James Noel | Ruiz, Derek, 1980- [Adapter]" editions="176" format="Book" holdings="7530" itemtype="itemtype-book" pswid="1151562357" title="The alchemist">123115868</work>
    <authors>
        <author lc="n94113544" viaf="65709090">Clarke, Alan [Author; Translator]</author>
        <author lc="no2005013941" viaf="12032914">Lemmens, Harrie, 1953- [Translator]</author>
        <author lc="no2010190009" viaf="160023476">Sampere, Daniel, 1985- [Illustrator; Draftsman]</author>
        <author lc="n86099875" viaf="52700">Coelho, Paulo</author>
    </authors>
    <orderBy>hold desc</orderBy>
    <input type="stdnbr">9780754073963</input>
    <!-- Snip -->
</classify>

我使用的是XML,但是使用的是PHP,而不是C#,所以我是新手,关于这方面的教程讲述了不同的事情让我对如何做以及如何做而感到困惑。 我只想从XML中获取这些东西:

  • 书的标题(在工作元素中)
  • 书籍作者(工作要素)
  • 本书的ISBN(在输入元素 - 类型stdnbr中)
  • 最受欢迎的DDC(推荐&gt; ddc&gt; mostPopular - 属性[nsfa])

但是我在这里和其他论坛上看到的例子我得到了NullReferenceException。

代码:

PS:它不是家庭作业。

public frmAddItem(string xml)
{
    InitializeComponent();
    string itemName = null, itemAuth = null, itemISBN = null;
    XDocument xdoc = new XDocument();
    xdoc = XDocument.Parse(xml);    
    string itemName = xdoc.Element("classify").Descendants("work").Where(s => s.Attributes() == "title");
    string itemAuth = xdoc.Element("classify").Descendants("work").Attributes("author").ToString();
    string itemISBN = xdoc.Element("classify").Descendants("input").ToString();
    txtTitle.Text = itemName;
    txtAuth.Text = itemAuth;
    txtISBN.Text = itemISBN;
    string itemDDC = xdoc.Element("ddc").Descendants("latestEdition").Attributes("sfa");
}

编辑重复:提到重复的链接与我的XML字符串不同/相似。它使用了一种不同的方法,如问题的开头所提到的那样无效。

1 个答案:

答案 0 :(得分:3)

由于您的XML文档定义了命名空间,因此API要求您使用命名空间限定元素名称。您的代码仅使用“本地”名称。有几种方法可以限定它们。下面的示例获取'title'属性。可以很容易地扩展它以获得您想要的任何其他内容/属性。

using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

public class Program
{
    public static void Main(string[] args)
    {
        var doc = XDocument.Load("http://classify.oclc.org/classify2/Classify?stdnbr=9780754073963");
        var nsManager = new XmlNamespaceManager(new NameTable());
        nsManager.AddNamespace("c", "http://classify.oclc.org");

        var work = doc.XPathSelectElement("//c:work", nsManager);
        Console.WriteLine(work.Attribute("title").Value);

        var mostPopular = doc.XPathSelectElement("//c:ddc/c:mostPopular", nsManager);
        Console.WriteLine(mostPopular.Attribute("nsfa").Value);            
    }
}