Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以从即将读取的xml文件中创建XmlNamespaceManager对象吗?_C#_Xml_Sharepoint_Infopath - Fatal编程技术网

C# 我可以从即将读取的xml文件中创建XmlNamespaceManager对象吗?

C# 我可以从即将读取的xml文件中创建XmlNamespaceManager对象吗?,c#,xml,sharepoint,infopath,C#,Xml,Sharepoint,Infopath,我在sharepoint上运行了一些c代码,我使用这些代码检查infopath文档的xml内部,以确定是应该检查文档还是放弃文档 对于我创建的两个不同的表单模板,代码运行良好,但在我最新创建的表单模板上失败。 我发现我正在创建的XmlNamespaceManager包含了错误的MyNamepsace定义 我会尽力解释的 我有这个代码来标记我的XmlNamespaceManager NameTable nt = new NameTable(); NamespaceManager = new Xml

我在sharepoint上运行了一些c代码,我使用这些代码检查infopath文档的xml内部,以确定是应该检查文档还是放弃文档

对于我创建的两个不同的表单模板,代码运行良好,但在我最新创建的表单模板上失败。 我发现我正在创建的XmlNamespaceManager包含了错误的MyNamepsace定义

我会尽力解释的

我有这个代码来标记我的XmlNamespaceManager

NameTable nt = new NameTable();
NamespaceManager = new XmlNamespaceManager(nt);

// Add prefix/namespace pairs to the XmlNamespaceManager.
NamespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
NamespaceManager.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
NamespaceManager.AddNamespace("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution");            
NamespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-07-14T13:45:59");
NamespaceManager.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");`
然后,我可以使用下面的代码行来搜索我要查找的xml

XPathNavigator nav = xml.CreateNavigator().SelectSingleNode("//my:HasSaved", NamespaceManager);
然后得到我想要的数据

这一切在我的几个表单模板上都很好。我有一个新的表单模板,我发现我需要使用这一行

NamespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-11-30T17:39:37");
日期不同

我的问题是,我不能添加两次,因为只有一组表单可以工作

所以我的问题是。有没有一种方法可以从XML文件生成NamespaceManager对象,因为它都包含在头文件中?
我找不到一个简单的方法来解决这个问题。

你不需要做这样的事情。只需对第二个名称空间使用my2或其他名称。然后,您需要为使用新名称空间的所有节点使用新名称空间前缀,并为仍然使用旧名称空间的所有节点使用旧的“我的名称空间”前缀。

一个选项是尝试使用第一个名称空间加载xml节点,如果没有任何结果,请调用PushScope,覆盖第一个名称空间定义,选择,等等

var doc = new XmlDocument();


doc.LoadXml(@"<?xml version=""1.0""?>
      <root xmlns:my=""http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-11-30T17:39:37"" value=""1"">
           <my:item>test</my:item>
      </root>");


var nameTable = new NameTable();

var namespaceManager = new XmlNamespaceManager(nameTable);


namespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");

namespaceManager.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");

namespaceManager.AddNamespace("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution");            

namespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-07-14T13:45:59");

namespaceManager.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");


// n will be null since the namespace url doesn't match

var n = doc.SelectSingleNode("descendant::my:item", namespaceManager);


namespaceManager.PushScope();

namespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-11-30T17:39:37");


// will work

n = doc.SelectSingleNode("descendant::my:item", namespaceManager);


namespaceManager.PopScope();

我找到了这样做的方法。可以从XmlDocument对象中提取my名称空间,而不是添加my名称空间。这可能只是一点运气,它的工作方式,但我很高兴它

NamespaceManager.AddNamespace("my", formXml.DocumentElement.NamespaceURI

formXML是从infopath XML创建的XML文档

谢谢。似乎你是唯一一个想这么做的人。。。当然不是我!这没有意义-为什么要在名称空间位于标题中时对其进行硬编码?我认为您无法控制InfoPath表单中元素和名称空间的名称-它们是自动生成的
NamespaceManager.AddNamespace("my", formXml.DocumentElement.NamespaceURI