它花了一段时间,但我终于能够根据命名空间和节点名称的用户输入修改XML文档:
string nodeName = "DefinitionName"; // this is really provided by the user
string namespace = "http://schemas.datacontract.org/2004/07/Xxx.Session"; // also user-provided
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(taskResolved.XmlPathAndFileName);
XmlElement rootElement = xmlDocument.DocumentElement;
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);
namespaceManager.AddNamespace("snuh", namespace); // hard-coded prefix, grrr...
XmlNodeList xmlNodes;
xmlNodes = rootElement.SelectNodes("//snuh:" + nodeName, namespaceManager);
我觉得我做错了,因为我必须硬编码前缀(snuh)。我可以尝试选择一个前缀,比如snuh,我希望它永远不会出现在文档中,但这并非万无一失。另一个选择是使用GUID作为前缀,但这似乎是一个黑客的解决方法。 我错过了什么吗?有更好的方法吗?
XML文档的顶部如下所示:
<?xml version="1.0" encoding="utf-8"?>
<SessionStateInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1"
z:Type="Xxx.SessionStateInfo"
z:Assembly="Xxx.Common, Version=6.2.0.0, Culture=neutral, PublicKeyToken=null"
xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns="http://schemas.datacontract.org/2004/07/Xxx.Session">
<CoaterNumber>25</CoaterNumber>
<DefinitionName z:Id="2">TwoLineMarkerDefinition</DefinitionName>
<EnableManualMode>true</EnableManualMode>
答案 0 :(得分:2)
如果您只想选择第一个DefinitionName节点。
你可以写
XmlNode node = rootElement[nodeName, namespace];
如果你想要整个清单:
XmlNodeList nodeList = rootElement.GetElementsByTagName(nodeName, namespace);
答案 1 :(得分:1)
如何使用XPath local-name()
和namespace-uri()
函数?
string xpath = string.Format("//*[local-name()='{0}' and namespace-uri()='{1}']", nodeName, namespace);
xmlNodes = rootElement.SelectNodes(xpath);
不知道XmlDocument
是否支持这些功能,但尚未对其进行测试。