zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Python之matplotlib库学习
    Linux相关指令和操作
    ubuntu安装vim
    classfication中使用图像金字塔和sliding windows提高准确率
    ubuntu16.04+caffe+python接口配置
    caffe中 softmax 函数的前向传播和反向传播
    cplusplus解析
    ZStack之ZDApp_Init解析
    Z-Stack ZMain学习
    ZigBee协议学习之网络层
  • 原文地址:https://www.cnblogs.com/lelehellow/p/6699655.html
Copyright © 2011-2022 走看看