使用信封重载 xml 中的名称空间
Overloading namespaces in xml with envelope
我有一个程序可以遍历 XML 文档来搜索值。
我想把找到的文档的版本号提取出来添加到搜索结果中
我遇到的问题是,文档有很多不同的命名空间,而且大多数都有一个信封。信封具有与文档有效负载中的发散命名空间相同的命名空间前缀。
我正在努力从有效负载中提取值,因为我无法获取内部文档的命名空间。
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>
有没有可能不先拆开信封就能看到里面的信息?
if (((XElement)xN).Value == value)
{
XNamespace myNs = ((XElement)xN).Name.Namespace;
myResultSet[0].Add(new ResultSet(file, myX.Root.Descendants(myNs + "MessageVersion").First().Value));
}
从结果而不是文档本身开始,提取命名空间和值就很容易了。
但这只有效,因为我正在暴力破解文档。我没有找到以清醒的方式做到这一点的解决方案......仍在寻找更好的解决方案。
我不确定您为什么要 'extract' 命名空间。命名空间是元素名称的一部分 - 正如您知道本地名称 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");
我有一个程序可以遍历 XML 文档来搜索值。 我想把找到的文档的版本号提取出来添加到搜索结果中
我遇到的问题是,文档有很多不同的命名空间,而且大多数都有一个信封。信封具有与文档有效负载中的发散命名空间相同的命名空间前缀。 我正在努力从有效负载中提取值,因为我无法获取内部文档的命名空间。
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>
有没有可能不先拆开信封就能看到里面的信息?
if (((XElement)xN).Value == value)
{
XNamespace myNs = ((XElement)xN).Name.Namespace;
myResultSet[0].Add(new ResultSet(file, myX.Root.Descendants(myNs + "MessageVersion").First().Value));
}
从结果而不是文档本身开始,提取命名空间和值就很容易了。
但这只有效,因为我正在暴力破解文档。我没有找到以清醒的方式做到这一点的解决方案......仍在寻找更好的解决方案。
我不确定您为什么要 'extract' 命名空间。命名空间是元素名称的一部分 - 正如您知道本地名称 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");