使用 C# 在 XML 文档中查找特定值的好方法是什么?
我正在调用 Oracle 公开的 WebService,该服务接受 ItemID 的输入并向我返回相应的 Item Number。 我想获取从响应中包含的 XML 返回的项目编号。
XML 如下所示:
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://dev1/MyWebService1.wsdl">
<env:Header>
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
env:mustUnderstand="1"/>
</env:Header>
<env:Body>
<ns0:getItemNbrByItemIdResponseElement>
<ns0:result>1010603</ns0:result>
</ns0:getItemNbrByItemIdResponseElement>
</env:Body>
</env:Envelope>
我只想获取
特别是 1010603。
我还没有做很多解析 XML 的工作使用 C#,到目前为止我正在尝试几种不同的方法。 推荐的方法是什么?
我使用的是 VS2008(因此 XPath 可用等)
I'm calling a WebService exposed by Oracle that accepts an input of an ItemID and returns to me the corresponding Item Number. I want to grab the Item Number that has been returned out of the XML contained in the response.
The XML looks like this:
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://dev1/MyWebService1.wsdl">
<env:Header>
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
env:mustUnderstand="1"/>
</env:Header>
<env:Body>
<ns0:getItemNbrByItemIdResponseElement>
<ns0:result>1010603</ns0:result>
</ns0:getItemNbrByItemIdResponseElement>
</env:Body>
</env:Envelope>
I'm interested in grabbing only the <ns0:result>1010603</ns0:result>
particularly only the 1010603.
I haven't done a lot of work parsing XML using C# and I'm playing around with a few different methods so far. What is the recommended way to do this?
I'm on VS2008 (so XPath is available etc.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我个人会使用 LINQ to XML,因为我发现它比 XPath 更容易处理,特别是在涉及命名空间时。 您可以执行以下操作:
请注意,此处的
doc
预计为XDocument
,不是XmlDocument
。 (我的猜测是,这就是它没有出现在你面前的原因。)I'd personally use LINQ to XML, because I find that easier to deal with than XPath, particularly when namespaces are involved. You'd do something like:
Note that
doc
here is expected to be anXDocument
, not anXmlDocument
. (My guess is that this is why it wasn't showing up for you.)fwiw,您可以使用 xpath 来解决命名空间问题,如下所示:
//*[local-name()='result']
fwiw you can cheat the namespace issue with an xpath like this:
//*[local-name()='result']
如果您不想使用 Linq,您可以使用 XPathDocument 来检索该值:
XPathDocument 的内存占用量较低,并且在您的场景中很可能比 XmlDocument 更快。 XmlDocument 在内存中构建 XML 文档的完整对象模型,而 XPathDocument 则不会这样做。
If you don't want to go for Linq you could use XPathDocument to retrieve the value:
XPathDocument has a lower memory footprint and is most likely faster in your scenario than XmlDocument. XmlDocument builds up a complete object model of your XML document in memory whereas XPathDocument does not do that.
我突然想到,以下内容应该可以工作:
命名空间代码如下所示:
您需要使用命名空间管理器,因为 XML 文档具有与其关联的命名空间,并且 XPath 在查询解析中使用它。
Off the top of my head, the following should work:
The namespace code looks like this:
You need to use the namespace manager because the XML document has namespaces associated with it, and XPath uses this in query resolution.
为了解决这个问题,我使用了 Jon Skeet 的答案。 这是我必须实现才能完成这项工作的代码(为了其他人未来的利益)。
当然,这是假设我从名为 request 的 HttpWebRequest 获取响应。
To solve this, I used Jon Skeet's answer. Here's the code that I had to implement to make this work (for anyone else's future benefit).
This of course assumes I'm getting my response back from an HttpWebRequest named request.
这个问题有非常好的和完整的答案。
只是出于好奇,我添加了一个极其简单的 XPath 表达式来完成此特定情况下的工作:
normalize-space(/)
在 C# 中,使用如下两行代码可以轻松完成此操作:
通过 .NET XPath 引擎的良好优化,其评估甚至可以是高效的。
There are very good and complete answers to this question.
I'd add just out of curiosity, that an extremely simple XPath expression does the job in this particular case:
normalize-space(/)
This is easily done in C# using something like the two lines below:
With the good optimization of the .NET XPath engine, its evaluation may even be efficient.