【问题标题】:How to parse XML that an element not always has the same structure如何解析元素并不总是具有相同结构的 XML
【发布时间】:2015-05-29 21:45:45
【问题描述】:

我有一个 C# 应用程序,用于检查客户端和服务器之间的 SOAP 消息。

请求和响应总是 XML 序列化。部分消息具有操作方法,我只需要获取方法,但我看到 XML 中我需要的元素并不总是具有相同的名称:

这是一个例子:

这是我需要解析的元素:

<a:Action s:mustUnderstand="1">http://tempuri.org/IMember/GetAuthorizations</a:Action>

有时也可以这样出现:

<Action d1p1:mustUnderstand="1" xmlns:d1p1="http://www.w3.org/2003/05/soap-envelope" xmlns="http://www.w3.org/2005/08/addressing">http://tempuri.org/IMember/GetAuthorizations</Action>

我需要得到的是URL的Method,在这种情况下我需要解析这个元素,这样我才能得到GetAuthorizations

关于如何解析两者的任何线索?我不知道它是第一种还是第二种。

【问题讨论】:

  • 看起来它们都是相同的 XML,但命名空间的应用不同。你是如何解析 XML 的?一个合适的 XML 解析器应该考虑这些命名空间。
  • 你能把它当作一个字符串吗?如果所有其他方法都失败了,您可能很容易通过这种方式进行区分,然后将其改组到正确的解析器......如果这确实是您的意图。
  • 是的其实是一个字符串
  • 您的第一个 XML 片段无效:它缺少 a 命名空间的定义。 (尝试上传here。)另一方面,您的第二个片段是有效的。这使我相信您可能在问题中省略了 XML 根节点。对于这两种情况,您能否编辑您的问题以包括 XML 根节点和任何中间节点到 Action 节点?
  • @VAAA 我认为这只是整个 XML 的一部分。如果正确,您还需要显示 as 前缀的声明。判断两个 XML 是否会被解析器视为相同,这一点很重要

标签: c# xml parsing


【解决方案1】:

试试这个

            string input = "<a:Action xmlns:a=\"http://tempuri.org\" xmlns:s=\"http://tempuri.org\" s:mustUnderstand=\"1\">\"http://tempuri.org/IMember/GetAuthorizations\"</a:Action>";
            XDocument doc = XDocument.Parse(input);

            string mustUnderstand = doc.Elements().Where(x => x.Name.LocalName == "Action").Attributes().Where(y => y.Name.LocalName == "mustUnderstand").FirstOrDefault().Value;​

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多