C#C#操作带名称空间的xml

此前操作xml一般用底这种艺术:

好处是XDocument 能使用linq

        xmlPath = “path”;
            XDocument myXDoc = XDocument.Load(xmlPath);
            IEnumerable<XElement> targetNodes = from target in myXDoc.Descendants("signal")
                                                where target.Attribute("signalname").Value == name
                                                select target;
            XElement element = targetNodes.First();

 

这种单纯方式遇到带名空间的就算坑了,看来参考中的少数首博客,发现以下方式可操作

       StreamReader reader=new StreamReader("path");
        XmlReader reader = XmlReader.Create(respStream);
            XElement root = XElement.Load(reader);
            XmlNameTable nameTable = reader.NameTable;
            XmlNamespaceManager namespaceManager = new XmlNamespaceManager(nameTable);
            namespaceManager.AddNamespace("wfs", "http://www.opengis.net/wfs");
            namespaceManager.AddNamespace("ows", "http://www.opengis.net/ows");
            namespaceManager.AddNamespace("ocg", "http://www.opengis.net/ocg");
            namespaceManager.AddNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
             namespaceManager.AddNamespace("gml", "http://www.opengis.net/gml");
            namespaceManager.AddNamespace("ogc", "http://www.opengis.net/ogc");
            namespaceManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
            namespaceManager.AddNamespace("myWorld","http://www.myWorld.com");
            XElement child1 = root.XPathSelectElement("./wfs:FeatureTypeList", namespaceManager);
            XElement child2 = child1.XPathSelectElement("./wfs:FeatureType", namespaceManager);//这里是重点,child2既然是child1的子节点,就必须调用child1的XPathSelectElement方法

地方的措施中也观看了,如果child2是child1的子节点,就非得调用child1的XPathSelectElement方法,这样只要想取一个深度很怪的XElement,是不是一旦手动一个个之找到该Parent节点,再用面的点子写一积聚。。。

child.XPathSelectElement()

想起了WPF中查找XMAL中指定节点的方法,于是我使用递归写了下面的办法来获取子节点。
调用GetNode,传入的参数是前一段代码的,最后xElementList 中得到的就是需要获取的XElement的集合。

如果使用注释中的代码,返回的是xml文档中的第一个检索到的XElement。

        List<XElement> xElementList = new List<XElement>();

/// <summary>
///
获得取子节点(不健全,根加点的首先级子节点无法得到,有需要的话需单独调用同一糟糕XElement
elelment = root.XPathSelectElement(nodePath, xmlNameSpaceManager);)
/// </summary>
/// <param name=”root”>根节点</param>
/// <param
name=”xmlNameSpaceManager”>命名空间管理器(我自己如此叫她)</param>
/// <param name=”nodeSpace”>需取得的节点的命名空间</param>
/// <param
name=”nodeName”>需取之节点的称,如<ows:DCP>,ows是称空间,DCP是那个名字</param>
/// <returns></returns>

private XElement GetNode(XElement root,XmlNamespaceManager xmlNameSpaceManager,string nodeSpace,string nodeName)
        {
            List<XElement> childList = root.Elements().ToList();
            for (int i = 0; i < childList.Count; i++)
            {
                XElement child = childList[i];
                var node = GetElement(child, xmlNameSpaceManager, nodeSpace, nodeName);
                if (node != null)
                {
                    xElementList.Add(node);
                    //return node;
                }
                else
                {
                    node = GetNode(child, xmlNameSpaceManager, nodeSpace, nodeName);
                    if (node != null)
                        xElementList.Add(node);
                        //return node;
                }
            }
            return xElementList;

//return node;

}

private XElement GetElement(XElement root, XmlNamespaceManager xmlNameSpaceManager, string nodeSpace, string nodeName)
        {
            var enumerator = xmlNameSpaceManager.GetEnumerator();
            while (enumerator.MoveNext())
            {
                var nameSpace = enumerator.Current.ToString();
                if (nameSpace.Equals(nodeSpace))
                {
                    string nodePath = "./" + nameSpace + ":" + nodeName;
                    XElement elelment = root.XPathSelectElement(nodePath, xmlNameSpaceManager);
                    if (elelment != null)
                        return elelment;
                }
            }
            return null;
        }

 

 

参考:

http://www.cnblogs.com/HQFZ/p/4788428.html

http://www.cnblogs.com/landeanfen/p/4636102.html

相关文章