Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
什么';我的xml有什么问题?_Xml_Xpath - Fatal编程技术网

什么';我的xml有什么问题?

什么';我的xml有什么问题?,xml,xpath,Xml,Xpath,我有以下xml: <messageContent xmlns="http://tempuri.org/" > <Message type="MappedMessage" > <Properties RequestId="Point-CurveRequest-8326ad44-a1cd-4a96-b4ef-1c4ad213d940" Action="getParCurves" EESId="EESID:NY:20100128:BASE" Currency="US

我有以下xml:

<messageContent xmlns="http://tempuri.org/" >
<Message type="MappedMessage" >
<Properties RequestId="Point-CurveRequest-8326ad44-a1cd-4a96-b4ef-1c4ad213d940"  Action="getParCurves"  EESId="EESID:NY:20100128:BASE"  Currency="USD"  Index="INX" />
<Body></Body>
</Message>
</messageContent>
但无论我做了什么尝试,我都无法得到我正在寻找的节点。基本上,我只是想看看是否有一个节点(名为“Message”)里面有一个“type”属性


有人知道吗?

您似乎需要在xpath上建立一个名称空间上下文,或者去掉xmlns=”http://tempuri.org/“

如果
messageContent
根节点您应该像这样省略它:
/Message[@type]
或者,如果您想检查文档的整个层次结构:
//Message[@type]

这不是一个直截了当的方法,但会起作用

XMLElement messageElement = (XMLElement) xmlDoc.SelectSingleNode("/messageContent/Message");
if(messageElement.HasAttribute("type"))
但问题是,如果您有一个节点消息,但不包含type属性,那么它就不是正确的xml格式

XMLNode messageElement = xmlDoc.SelectSingleNode("/messageContent/Message[@type='MappedMessage']");
if(messageElement != null)
{
//Do SOmething
}

您的XML绝对没有问题-但是XPath表达式有问题:-)

将XML命名空间管理器添加到代码中:

XmlNamespaceManager mgr = new XmlNamespaceManager(xdoc.NameTable);
mgr.AddNamespace("ns", "http://tempuri.org/");
然后在执行
选择SingleNode
时使用该命名空间管理器:

var messageType = xdoc.SelectSingleNode("/ns:messageContent/ns:Message[@type]", mgr);

这应该行。

即使它是整个文档的默认名称空间,它是否仍然有效?是的,我想我需要知道您使用的是什么XPath包,或者您使用的是什么语言。@b参数:有趣,在PHP下使用SimpleXml时不是这样的-虽然我不确定我认为在使用DOMDCUMENT时也不重要。。。只要它是整个文档的默认ns。这应该解释更多:@或A:您可以发布使用MSDN用法示例的实现吗?
var messageType = xdoc.SelectSingleNode("/ns:messageContent/ns:Message[@type]", mgr);