C#中取得带前缀的xml文件的节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中取得带前缀的xml文件的节点相关的知识,希望对你有一定的参考价值。

这是XML文档,我想取最后<rs:data>中的数据,但获取不到该节点,大侠们帮我看看怎么回事

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z="#RowsetSchema">
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly' rs:updatable='true'>
<s:AttributeType name='c0' rs:name='门店号' rs:number='1'>AAAA </s:AttributeType>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row c0='001' c1='2011-02-16 16:23:40' c2='2011-02-16 16:24:27'/>
</rs:data>
</xml>

XmlDocument doc = new XmlDocument();
doc.Load(xmlFile.FullName); //载入文件
XmlElement root = doc.DocumentElement;
string nameSpace = root.NamespaceURI;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rs", nameSpace);
nsmgr.AddNamespace("s", ....);
nsmgr.AddNamespace("dt", ...);
。。。。//总之就是把前面声明的命名空间都加进去

XmlNode node = root.SelectSingleNode("data", nsmgr); //该处node一直为null不知怎么回事?
//////////////
其实说白了我就想,不管前面声明的名字是rs还是aaaaa,我只想取到“data”这个节点,可是怎么取到总是空呢?
C#中有一个方法,getElmentByTagName("data","urn:schemas-microsoft-com:rowset")这样可以取到data这个节点,但是我
现在不想有这个函数,想用SelectSingleNode(xpath,nsmgr),怎么就不行呢!!
msdn上的例子取得属性的时候有前缀是可以的,可是节点的名字有前缀还是不好使。
有没有高手解决这个问题呢??
第一次提问,没有啥悬赏啊,实在抱歉。

参考技术A 试下XmlNode node = root.SelectSingleNode("rs:data");

使用 LINQ - C# 在 xml 文件中的特定节点下方添加新元素

【中文标题】使用 LINQ - C# 在 xml 文件中的特定节点下方添加新元素【英文标题】:adding a new element below specific node in a xml file using LINQ - C# 【发布时间】:2018-01-21 02:37:14 【问题描述】:

我是 C# 新手,我已经尝试了很多天,但我没有解决我的问题的答案。

我有一个这样的 xml 文档,它在 windows 窗体应用程序中填充树视图:

<?xml version="1.0" encoding="utf-8" ?>
<root>
<folder title='Standard Elements'>
  <folder title='Screw' >
    <folder title='Type 1' >
      <record title='DIN EN ISO 4762' />
      <record title='DIN EN ISO 7964' />
      <record title='DIN EN ISO 21269' />
    </folder>
    <folder title='Type 2' >
      <record title='DIN EN ISO 4026' />
      <record title='DIN EN ISO 4027' />
      <record title='DIN EN ISO 4028' />
    </folder>
    <folder title='Type 3' >
      <record title='DIN EN ISO 4014' />
      <record title='DIN EN ISO 4017' />
      <record title='DIN EN ISO 4762' />
      <record title='DIN EN ISO 24015' />
    </folder>
  </folder>
  <folder title='Bearing' >
  </folder>
  <folder title='Pin' >
  </folder>
</folder>
  <folder title='Shaft' >
  </folder>
</root>

我必须在标题为“Type 2”或其他指定节点的节点下方包含一个新元素。我在我的应用程序中使用了 Linq,但我不知道如何处理这种情况。

【问题讨论】:

【参考方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);

            XElement type2 = doc.Descendants("folder").Where(x => (string)x.Attribute("title") == "Type 2").FirstOrDefault();

            type2.Add(new XElement("record", new XAttribute("title", "DIN EN ISO 4029")));
        
    

【讨论】:

效果很好。其实我现在觉得很傻。感谢您的回答。【参考方案2】:

您可以使用框架提供的XMLDocument 类型。选择您需要的节点,创建一个新节点对象并将其作为子节点添加到您选择的节点。

你的问题类似这样:Modify XML existing content in C#

【讨论】:

如果我理解使用该解决方案的权利,我将不得不修改我无法执行的 XML 文件的结构,因为我从其他应用程序接收文件。我必须找到属性为“Type 2”的节点并在其中添加一个新节点。

以上是关于C#中取得带前缀的xml文件的节点的主要内容,如果未能解决你的问题,请参考以下文章

使用 XElement 创建带前缀的 XML 元素

3 尝试使用 C# 删除 XML 节点

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间

C#如何读取xml文件里面节点里面的属性信息?

C#在xml文件中指定节点插入节点和属性

在c#的winform 下怎么读取 xml文件中的数据?