gpt4 book ai didi

c# - 从 xml 文件中获取节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:16:32 24 4
gpt4 key购买 nike

如何解析xml文件?

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>link</loc>
<lastmod>2011-08-17T08:23:17+00:00</lastmod>
</sitemap>
<sitemap>
<loc>link</loc>
<lastmod>2011-08-18T08:23:17+00:00</lastmod>
</sitemap>
</sitemapindex>

我是 XML 的新手,我试过了,但它似乎不起作用:

        XmlDocument xml = new XmlDocument(); //* create an xml document object. 
xml.Load("sitemap.xml");
XmlNodeList xnList = xml.SelectNodes("/sitemapindex/sitemap");
foreach (XmlNode xn in xnList)
{
String loc= xn["loc"].InnerText;
String lastmod= xn["lastmod"].InnerText;
}

最佳答案

问题在于 sitemapindex 元素定义了默认命名空间。选择节点时需要指定命名空间,否则将找不到它们。例如:

XmlDocument xml = new XmlDocument();
xml.Load("sitemap.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
manager.AddNamespace("s", "http://www.sitemaps.org/schemas/sitemap/0.9");
XmlNodeList xnList = xml.SelectNodes("/s:sitemapindex/s:sitemap", manager);

通常来说,在使用XmlNameSpaceManager 时,您可以将前缀保留为空字符串,以指定您希望该 namespace 成为默认 namespace 。所以你会认为你可以做这样的事情:

// WON'T WORK
XmlDocument xml = new XmlDocument();
xml.Load("sitemap.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
manager.AddNamespace("", "http://www.sitemaps.org/schemas/sitemap/0.9"); //Empty prefix
XmlNodeList xnList = xml.SelectNodes("/sitemapindex/sitemap", manager); //No prefixes in XPath

但是,如果您尝试该代码,您会发现它找不到任何匹配的节点。原因是在 XPath 1.0(这是 XmlDocument 实现的)中,当没有提供命名空间时,它总是使用 null 命名空间,而不是默认命名空间。因此,无论您是否在 XmlNamespaceManager 中指定默认 namespace 都没有关系,无论如何 XPath 都不会使用它。引用Official XPath Specification中的相关段落:

A QName in the node test is expanded into an expanded-name using the namespace declarations from the expression context. This is the same way expansion is done for element type names in start and end-tags except that the default namespace declared with xmlns is not used: if the QName does not have a prefix, then the namespace URI is null (this is the same way attribute names are expanded). It is an error if the QName has a prefix for which there is no namespace declaration in the expression context.

因此,当您正在读取的元素属于一个 namespace 时,您无法避免将 namespace 前缀放在您的 XPath 语句中。但是,如果您不想在代码中放入命名空间 URI,您可以只使用 XmlDocument 对象返回根元素的 URI,在本例中,这就是您想要的.例如:

XmlDocument xml = new XmlDocument();
xml.Load("sitemap.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
manager.AddNamespace("s", xml.DocumentElement.NamespaceURI); //Using xml's properties instead of hard-coded URI
XmlNodeList xnList = xml.SelectNodes("/s:sitemapindex/s:sitemap", manager);

关于c# - 从 xml 文件中获取节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com