我想抓住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>
答案 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查询以测试您的查询:
答案 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”,你只需要使用元素的名称)。