代码之家  ›  专栏  ›  技术社区  ›  kervin

获取带有属性的xmlnode open标记

  •  2
  • kervin  · 技术社区  · 15 年前

    是否可以从具有所有属性、命名空间等的xmlnode获取open标记?

    如。

    <root xmlns="urn:..." rattr="a">
       <child attr="1">test</child>
    </root>
    

    我想从xmlnode和后面的结束标记中检索整个开始标记,尽可能与从原始xml文档中检索的完全一样。都是弦乐。

    基本上xmlnode.outerxml没有子节点。

    编辑

    更详细地说,使用上面的xml创建的节点上的xml node.outerxml将返回整个xml片段,包括作为单个字符串的子节点。

    同一片段上的xmlnode.innerXML将返回子节点,而不是父节点,同样作为单个字符串返回。

    但是我需要XML片段的开始标记,而不需要子节点。并且不使用xmltattribute数组、localname、命名空间等构建它。

    这是C 3.5

    谢谢

    3 回复  |  直到 15 年前
        1
  •  1
  •   Jon Skeet    15 年前

    我想最简单的方法就是打电话 XmlNode.CloneNode(false) 它(根据文档)将克隆所有属性,但不克隆子节点。你可以用 OuterXml -尽管这也会给你最后的标签。

    例如:

    using System;
    using System.Xml;
    
    public class Test
    {
        static void Main()
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(@"<root xmlns='urn:xyz' rattr='a'>
               <child attr='1'>test</child></root>");
            XmlElement root = doc.DocumentElement;
            XmlNode clone = root.CloneNode(false);
            Console.WriteLine(clone.OuterXml);
        }
    }
    

    输出:

    <root xmlns="urn:xyz" rattr="a"></root>
    

    注意,这可能不是 确切地 根据最初的XML文档,在属性排序等方面,它至少是 相等的 .

        2
  •  2
  •   Robert Rossney    15 年前

    有什么原因你不能简单地说:

    string s = n.OuterXml.Substring(0, n.OuterXml.IndexOf(">") + 1);
    
        3
  •  1
  •   tzup    15 年前

    怎么样:

     xmlNode.OuterXML.Replace(xmlNode.InnerXML, String.Empty);
    

    可怜的人的解决方案:)