gpt4 book ai didi

c# - 查询 XmlDocument 而不会出现 'Namespace prefix is not defined' 问题

转载 作者:可可西里 更新时间:2023-11-01 08:45:49 25 4
gpt4 key购买 nike

我有一个 Xml 文档,它定义并引用了一些命名空间。我将它加载到一个 XmlDocument 对象中,据我所知,我创建了一个 XmlNamespaceManager 对象,用于查询 Xpath。问题是我收到 XPath 异常,表示命名空间“my”未定义。如何让命名空间管理器看到我引用的命名空间已经定义。或者更确切地说,如何将命名空间定义从文档获取到命名空间管理器。

此外,令我感到奇怪的是,您必须首先为从文档命名表创建的文档提供命名空间管理器。即使您需要硬编码手动命名空间,为什么不能将它们直接添加到文档中。为什么每次查询都必须传递这个 namespace 管理器? XmlDocument 不能知道什么?

代码:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(programFiles + @"Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\HfscBookingWorkflow\template.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(xmlDoc.NameTable);

XmlNode referenceNode = xmlDoc.SelectSingleNode("/my:myFields/my:ReferenceNumber", ns);
referenceNode.InnerXml = this.bookingData.ReferenceNumber;

XmlNode titleNode = xmlDoc.SelectSingleNode("/my:myFields/my:Title", ns);
titleNode.InnerXml = this.bookingData.FamilyName;

XML:

  <?xml version="1.0" encoding="UTF-8" ?> 
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:Inspection:-myXSD-2010-01-15T18-21-55" solutionVersion="1.0.0.104" productVersion="12.0.0" PIVersion="1.0.0.0" ?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">
<my:DateRequested xsi:nil="true" />
<my:DateVisited xsi:nil="true" />
<my:ReferenceNumber />
<my:FireCall>false</my:FireCall>

更新:

ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ns.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
ns.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55");

这完成了工作,但这意味着我必须针对这个特定的 xml 模式进行硬编码。此架构表示信息路径表单模板。特别是每个表单模板的 my 命名空间 url 都会不同,所以我真的不想对此进行硬编码。如果能找到一种干净的方法来从 xml 中获取此命名空间而不求助于 RegEx,那就太好了。

我希望 XmlNamespaceManager 能够从 NameTable 中获取命名空间定义。我的意思是它们在 Xml 中,但我仍然必须定义它们。

最佳答案

ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ns.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
ns.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55");

这完成了工作,但这意味着我必须针对这个特定的 xml 模式进行硬编码。此架构表示信息路径表单模板。特别是每个表单模板的 my 命名空间 url 都会不同,所以我真的不想对此进行硬编码。如果能找到一种干净的方法从 xml 中获取此命名空间而不求助于正则表达式,那就太好了。

我希望 XmlNamespaceManager 能够从 NameTable 中获取命名空间定义。我的意思是它们在 Xml 中,但我仍然必须定义它们。

关于c# - 查询 XmlDocument 而不会出现 'Namespace prefix is not defined' 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com