簡體   English   中英

從XMLDocument中的xml文件讀取節點

[英]reading node from xml file in XMLDocument

我試圖抓住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>

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

如果你只需要一個特定的元素,那么我將使用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/

以下快速和臟的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”,你只需要使用元素的名稱)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM