使用Namespace时,使用xpath从XML获取值

时间:2012-11-21 05:36:17

标签: c# xml xpath xmldocument

我是xpath匹配的新手。这里我有一个传递XML包含为字符串的方法。我将其转换为XmlDocument。

public static void getProjectDataInfo(string content) {

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(content);
}

这是我的XML。它有xmlns:my

<?xml version="1.0" encoding="UTF-8"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
  <my:Financial>
      <my:Quote>
     <my:CHARGE_TYPE>MRC</my:CHARGE_TYPE>
     <my:Price>463.92</my:Price>
      </my:Quote>
  </my:Financial>
</my:myField>

我只想获得

的值
/my:myFields/my:Financial/my:Quote/my:Price

但是我无法获取值,因此这个XML有xmlns。

请帮帮我。

4 个答案:

答案 0 :(得分:5)

使用XmlNamespaceManager

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46");

var str = doc.XPathSelectElement("/root/ns:myFields/ns:Financial/ns:Quote/ns:Price", nsmgr)
            .ToString(SaveOptions.DisableFormatting);
Console.WriteLine(str);

答案 1 :(得分:0)

使用LINQ2XML

XElement doc=XElement.Parse(content);
XNamespace my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46";
var price=doc.Element(my+"myFields").Element(my+"Financial").Element(my+"Quote").Element(my+"Price").Value;

OR [如果你想坚持 OLD 的事情]

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.OwnerDocument.NameTable);
nsmgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46");
var priceNode = el.SelectNode(@"/my:myFields/my:Financial/my:Quote/my:Price", nsmgr);

答案 2 :(得分:0)

您需要告诉XmlDocument my前缀绑定到哪个。您使用XmlNamespaceManager来执行此操作。这是一个示例http://support.microsoft.com/kb/316913。在你的情况下,你会这样做:

xmlns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46")

答案 3 :(得分:0)

对于2013年的Infopath表格,可能如下:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());                 nsmgr.AddNamespace(“my”,“http://schemas.microsoft.com/office/infopath/2003/myXSD/2014-11-10T18:44:26”);

XmlNode root = doc.DocumentElement;

XmlNode yourIDNode = root.SelectSingleNode(“/ my:myFields / my:YourID”,nsmgr);

详细信息“my”命名空间定义,您可以从Share Point文档库下载,其中您的infopath表单提交了xml数据。下载其中一个保存的infopath表单xml数据文件,并用记事本打开它,然后你会在内容的顶部找到它。