从XMLDocument中的xml文件读取节点

时间:2011-09-16 21:52:35

标签: c# xml

我想抓住TopicName我该如何去追求它并尝试不同的组合,但不知何故我无法得到TopicName以下是我的源代码...

XmlDocument xdoc = new XmlDocument();//xml doc used for xml parsing

    xdoc.Load(
        "http://latestpackagingnews.blogspot.com/feeds/posts/default"
        );//loading XML in xml doc

    XmlNodeList xNodelst = xdoc.DocumentElement.SelectNodes("content");//reading node so that we can traverse thorugh the XML

    foreach (XmlNode xNode in xNodelst)//traversing XML 
    {
        //litFeed.Text += "read";
    }

示例xml文件

<content type="application/xml">
 <CatalogItems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="sitename.xsd">
        <CatalogSource Acronym="ABC" OrganizationName="ABC Corporation" />
        <CatalogItem Id="3212" CatalogUrl="urlname">
          <ContentItem xmlns:content="sitename.xsd" TargetUrl="url">
            <content:SelectionSpec ClassList="" ElementList="" />
            <content:Language Value="eng" Scheme="ISO 639-2" />
            <content:Source Acronym="ABC" OrganizationName="ABC Corporation" />
            <content:Topics Scheme="ABC">
              <content:Topic TopicName="Marketing" />
              <content:Topic TopiccName="Coverage" />
            </content:Topics>
          </ContentItem>
        </CatalogItem>
      </CatalogItems>
    </content>

3 个答案:

答案 0 :(得分:8)

XML中的Topic节点正在使用content命名空间 - 您需要在代码中声明并使用XML命名空间,然后您可以使用SelectNodes()来获取节点兴趣 - 这对我有用:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("content", "sitename.xsd");

var topicNodes = xdoc.SelectNodes("//content:Topic", nsmgr);

foreach (XmlNode node in topicNodes)
{
    string topic = node.Attributes["TopicName"].Value;
}

正如比较一样,看看Linq对XML的容易程度:

XDocument xdoc = XDocument.Load("test.xml");
XNamespace ns = "sitename.xsd";
string topic = xdoc.Descendants(ns + "Topic")
                   .Select(x => (string)x.Attribute("TopicName"))
                   .FirstOrDefault();

要获取所有主题,您可以将最后一个语句替换为:

var topics = xdoc.Descendants(ns + "Topic")
                 .Select(x => (string)x.Attribute("TopicName"))
                 .ToList();

答案 1 :(得分:0)

如果您只需要一个特定元素,那么我将使用XPath:

这是在C#中使用XPath的指南: http://www.codeproject.com/KB/XML/usingXPathNavigator.aspx

这是一个可以为您提供主题集合的查询:

//content/CatalogItems/CatalogItem/ContentItem/content:Topics/content:Topic

您可以调整此查询,具体取决于您要完成的操作,只获取特定的TopicName值:

//content/CatalogItems/CatalogItem/ContentItem/content:Topics/content:Topic/@TopicName

XPath非常容易学习。在没有先验知识的情况下,我很快就完成了这样的事情。

您可以在此处粘贴XML和xpath查询以测试您的查询:

http://www.bit-101.com/xpath/

答案 2 :(得分:0)

以下快速而又脏的LINQ to XML代码获取您的TopicNames并在控制台上打印它们。

XDocument lDoc = XDocument.Load(lXmlDocUri);

foreach (var lElement in lDoc.Element("content").Element(XName.Get("CatalogItems", "sitename.xsd")).Elements(XName.Get("CatalogItem", "sitename.xsd")))
{
     foreach (var lContentTopic in lElement.Element(XName.Get("ContentItem", "sitename.xsd")).Element(XName.Get("Topics", "sitename.xsd")).Elements(XName.Get("Topic", "sitename.xsd")))
     {
           string lTitle = lContentTopic.Attribute("TopicName").Value;
           Console.WriteLine(lTitle);
     }
}

如果它不适用于所有命名空间:)它会短得多(而不是“XName.Get”,你只需要使用元素的名称)。