使用c#读取包含xmlns属性的xml节点

本文关键字:xml 节点 属性 xmlns 读取 包含 使用 | 更新日期: 2023-09-27 18:19:00

我想用c#读取下面的xml。

<configuration>
  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
  <spring>
    <context>
      <resource uri="config://spring/objects" />
    </context>
    <objects xmlns="http://www.springframework.net">
<object></object>
</objects>
</spring>
</configuration>

它不会从对象节点中识别xmlns。

string xmlFile = @"App1.config";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlFile);
XmlNodeList nodeList = xmlDoc.SelectNodes("configuration/spring/objects/object");
foreach (XmlElement xmlElement in nodeList)
{
    string id = xmlElement.GetAttribute("id");  //Output - SimulatorControlTCP
    XmlNodeList xmlPropertyNodeList = xmlElement.SelectNodes("property");
    foreach (XmlElement xmlPropertyElement in xmlPropertyNodeList)
    {
        id = xmlPropertyElement.GetAttribute("value");
        if ((id.Contains("tcp") || id.Contains("http")) && id.Contains("localhost"))
        {
            id = id.Replace("localhost","1.1.1.1");
            xmlPropertyElement.Attributes[1].Value = id;
            xmlDoc.Save(xmlFile); 
        }
    }
}

它不会进入foreach循环。如果我删除xmlns,那么上面的代码可以正常工作。

这是一个老问题,但我想很多人都有这个问题,就像我一样。

xmlns代表:XML命名空间。因此,当它出现在XML中时,您需要使用它来进行搜索。例如,如果您想查找一个类似"<url xmlns='sm'>"的元素,您需要指定您正在查找一个名称为"url",名称空间为"sm"的元素。

为什么?对不起,我不能确切地回答为什么,但它是这样工作的。

好吧,为了解决我的问题,我已经改变了我的代码使用XmlReader和LinqToXML,使事情"容易得多"。

这是XML:

   <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
      <url>
        <loc>http://www.url.com/</loc>
        <changefreq>daily</changefreq>
        <priority>1.00</priority>
      </url>
      <url>
        <loc>http://www.url.com/</loc>
        <changefreq>daily</changefreq>
        <priority>0.9000</priority>
      </url>
      <url>
        <loc>http://www.url.com/</loc>
        <changefreq>daily</changefreq>
        <priority>0.9000</priority>
      </url>
      <url>
        <loc>http://www.url.com/</loc>
        <changefreq>daily</changefreq>
        <priority>0.9000</priority>
      </url>
    </urlset>

这是我用来读取它的代码:

        XDocument xmlDoc = XDocument.Load("sitemap.xml");
        if (xmlDoc.Elements().Count() > 0)
        {
            using (MemoryStream memStream = new MemoryStream())
            {
                xmlDoc.Save(memStream);
                memStream.Position = 0;
                using (XmlReader reader = XmlReader.Create("sitemap.xml", new XmlReaderSettings() { IgnoreWhitespace = true }))
                {
                    reader.MoveToContent();
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName.Equals("url", StringComparison.OrdinalIgnoreCase))
                        {
                            XElement el = XNode.ReadFrom(reader) as XElement;
                            if (el == null)
                                continue;
                            XName loc = XName.Get("loc", el.Name.Namespace.NamespaceName);
                            XName changefreq = XName.Get("changefreq", el.Name.Namespace.NamespaceName);
                            XName priority = XName.Get("priority", el.Name.Namespace.NamespaceName);
                            var elLoc = el.Element(loc);
                            var elChangeFreq = el.Element(changefreq);
                            var elPriority = el.Element(priority);
                        }
                    }
                }
            }
        }

希望这对你有帮助。

使用c#读取包含xmlns属性的xml节点

单向:

            DataSet ds = new DataSet();
            ds.ReadXml(Server.MapPath("YourFile.xml"));
            GridView1.DataSource = ds;
            GridView1.DataBind();
下:


<asp:Xml ID="Xml1" runat="server" DocumentSource="~/XML/XMLFile.xml">
    </asp:Xml>

关于第二种方法的更多信息,请参见
http://www.codeproject.com/KB/aspnet/ASPNET_20_XMLControl.aspx