我有以下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>
然后我有这个问题:
var messageType = xmlDoc.SelectSingleNode("/messageContent/Message[@type]");
但无论我尝试过什么,我都无法得到我正在寻找的节点。基本上我只是试着看看是否有一个节点(名为“Message”),里面有一个“type”属性。
有人有任何想法吗?
答案 0 :(得分:3)
你的XML绝对没有问题 - 你的XPath表达式有问题,但是: - )
在代码中添加XML命名空间管理器:
XmlNamespaceManager mgr = new XmlNamespaceManager(xdoc.NameTable);
mgr.AddNamespace("ns", "http://tempuri.org/");
然后在执行SelectSingleNode
时使用该命名空间管理器:
var messageType = xdoc.SelectSingleNode("/ns:messageContent/ns:Message[@type]", mgr);
这应该有效。
答案 1 :(得分:1)
您似乎需要在xpath上建立命名空间上下文,或者摆脱xmlns =“http://tempuri.org/”。
答案 2 :(得分:0)
直接向前但不会工作
XMLElement messageElement = (XMLElement) xmlDoc.SelectSingleNode("/messageContent/Message");
if(messageElement.HasAttribute("type"))
但问题是如果你有一个节点Message但是不包含type属性那么它的xml.Rather格式不合适我建议检查类型属性的内容,如下所示
XMLNode messageElement = xmlDoc.SelectSingleNode("/messageContent/Message[@type='MappedMessage']");
if(messageElement != null)
{
//Do SOmething
}
答案 3 :(得分:-1)
如果messageContent
是 root 节点,则应省略它:/Message[@type]
或者如果要检查文档的整个层次结构://Message[@type]
< / p>