查找名称中包含句点的元素

时间:2014-11-18 17:29:26

标签: c# .net xpath

我有以下XML:

<T24.MESSAGE>
<TRANSACTION.TYPE>CHEQUE.ON.THEM.AUTH</TRANSACTION.TYPE>
<TRANSACTION.ID>FT14273PKQ14</TRANSACTION.ID>
</T24.MESSAGE>

我正在尝试使用xpath查询TRANSACTION.TYPE找到/TRANSACTION.TYPE元素。但是,这没有返回任何内容,我认为这是因为元素在名称中有一个句点。

有没有办法逃避这段时间?虽然根据MS参考,但不需要它。 http://msdn.microsoft.com/en-us/library/ms256199%28v=vs.110%29.aspx

修改:我还尝试了/T24.MESSAGE/TRANSACTION.TYPETRANSACTION.TYPE,但都没有工作。

我用来读它的代码:

byte[] xmlBytes = Encoding.UTF8.GetBytes(strXML);
using (MemoryStream xmlStream = new MemoryStream(xmlBytes))
{
   XPathDocument doc = new XPathDocument(XmlReader.Create(xmlStream, xmlReaderSettings));
   var navigator = doc.CreateNavigator();
   var node = navigator.SelectSingleNode("/TRANSACTION.TYPE"); //null
   //...
}

3 个答案:

答案 0 :(得分:1)

由于您正在使用命名空间,因此您可能会尝试在代码中使用命名空间无关的表单。它看起来像这样

    var node = navigator.SelectSingleNode("//*[local-name()='TRANSACTION.TYPE']");

答案 1 :(得分:1)

问题在于您的命名空间。您需要创建XmlNamespaceManager并将其传递给SelectSingleNode来电。

在下面我创建了urn:test的命名空间:

string strXML = @"<?xml version='1.0'?>
            <T24.MESSAGE xmlns=""urn:Test"">
            <TRANSACTION.TYPE>CHEQUE.ON.THEM.AUTH</TRANSACTION.TYPE>
            <TRANSACTION.ID>FT14273PKQ14</TRANSACTION.ID>
            </T24.MESSAGE>";

byte[] xmlBytes = Encoding.UTF8.GetBytes(strXML);
using (MemoryStream xmlStream = new MemoryStream(xmlBytes))
{
    XPathDocument doc = new XPathDocument(XmlReader.Create(xmlStream));
    var navigator = doc.CreateNavigator();

    XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(navigator.NameTable);

    //Add the namespaces used. In this instance I'm setting a prefix of "t"
    xmlnsManager.AddNamespace("t", "urn:Test");

    //pass the XmlNamespaceManager to the call to SelectSingleNode
    //the XPath also includes the root element
    var node = navigator.SelectSingleNode("//t:T24.MESSAGE/t:TRANSACTION.TYPE", xmlnsManager);

    Console.WriteLine(node.Name);

}

此代码正确ouptuts

  

TRANSACTION.TYPE

答案 2 :(得分:0)

这肯定有效

string yourXMLString = @"<T24.MESSAGE>
                         <TRANSACTION.TYPE>CHEQUE.ON.THEM.AUTH</TRANSACTION.TYPE>
                         <TRANSACTION.ID>FT14273PKQ14</TRANSACTION.ID>
                         </T24.MESSAGE>";

XDocument xDoc = XDocument.Parse(yourXMLString);

var res = xDoc.Descendants("T24.MESSAGE")
              .Elements("TRANSACTION.TYPE");

结果:<TRANSACTION.TYPE>CHEQUE.ON.THEM.AUTH</TRANSACTION.TYPE>