使用信封

时间:2017-10-12 09:10:33

标签: c# xml namespaces envelope

我有一个程序可以遍历XML文档来搜索值。 我想提取我找到的文档的版本号,并将其添加到搜索结果中。

我遇到的问题是,文档有很多不同的命名空间,而且大多数都有一个信封。信封具有与文档有效负载中的不同命名空间相同的namespaceprefix。 我正在努力从有效负载中提取值,因为我无法获得内部文档的命名空间。

if (myX != null)
{
    XNamespace myNs;
    if (myX.Root.FirstAttribute == null)
        myNs = "";
    else
    {
        myNs = myX.Root.FirstAttribute.Value;
        var dummy2 = myX.Root.Descendants("Message").First().FirstAttribute;
        var dummy1 = myX.Root.Descendants(myNs + "Message").First().FirstAttribute;

    }


    foreach (XNode xN in myX.Root.DescendantNodes())
    {
        if (xN is XElement)
        {
            if (!wildcard)
            {
                if (((XElement)xN).Value == value)
                {
                    myResultSet[0].Add(new ResultSet(file, myX.Root.Descendants(myNs + "MessageVersion").First().Value));
                }
            }
            else if (wildcard)
            {
                if (((XElement)xN).Value.Contains(value))
                {
                    myResultSet[0].Add(new ResultSet(file, myX.Root.Descendants(myNs + "MessageVersion").First().Value));
                }
            }
        }
    }
}

我可以获得ns0:Body元素,但是我没有得到" http://dummy.schema.com/ss2/schemas/2.5/DESADV"命名空间。 XML是这样的:

<ns0:Envelope xmlns:ns0="http://dummy.schema.com/ss2/schemas/2.3">
  <ns0:SenderILN>123456789123</ns0:SenderILN>
  <ns0:ReceiverILN>987654321987</ns0:ReceiverILN>
  <ns0:EnvelopeNumber>12345</ns0:EnvelopeNumber>
  <ns0:Body>
    <ns0:Message xmlns:ns0="http://dummy.schema.com/ss2/schemas/2.5/DESADV">
      <ns0:Header>
        <ns0:MessageType>DESADV</ns0:MessageType>
        <ns0:SenderILN>123456789123</ns0:SenderILN>1
        <ns0:ReceiverILN>987654321987</ns0:ReceiverILN>
        <ns0:MessageVersion>2.5</ns0:MessageVersion>
      </ns0:Header>
      <ns0:DESADV>
        <ns0:Payload />
      </ns0:DESADV>
    </ns0:Message>
  </ns0:Body>
</ns0:Envelope>

是否有可能在不先删除信封的情况下进入内部消息?

2 个答案:

答案 0 :(得分:0)

if (((XElement)xN).Value == value)
{
    XNamespace myNs = ((XElement)xN).Name.Namespace;
    myResultSet[0].Add(new ResultSet(file, myX.Root.Descendants(myNs + "MessageVersion").First().Value));
}

从结果开始而不是文档本身后,很容易提取命名空间和值。

但这只是有效的,因为我粗暴地强迫文件。我发现没有办法以清醒的方式做到这一点......仍在寻找更好的解决方案。

答案 1 :(得分:0)

我不确定你为什么试图“提取”命名空间。命名空间是元素名称的一部分 - 就像您知道本地名称MessageVersion一样,您也应该知道它的命名空间。

你应该这样做:

XNamespace ns = "http://dummy.schema.com/ss2/schemas/2.5/DESADV"

var version = (string) doc
    .Descendants(ns + "MessageVersion")
    .Single();

如果由于某种原因您不知道或不关心命名空间,您只需按本地名称搜索:

var version = (string) doc
    .Descendants()
    .Single(x => x.Name.LocalName == "MessageVersion");