Linq:后代不会 return 结果
Linq: Descendants won't return result
我有这个简单的 xml 文件:
<Document xmlns="urn:com.place:dps-if-gfc-request.001">
<ReqHdr>
<MsgId>IE1611240000000100000001</MsgId>
<CreDtTm>2016-11-24T10:14:33.327Z</CreDtTm>
<AppInstanceId>DPSH</AppInstanceId>
<TxId>FirstTxId</TxId>
</ReqHdr>
<ReqTxInf>
<PmtId>
<TxId>SecondTxId</TxId>
</PmtId>
<MsgTyp>Request</MsgTyp>
<CtgyPurp>
<Prtry>ECRI</Prtry>
</CtgyPurp>
</ReqTxInf>
</Document>
我正在尝试获取第一个元素的内容:
var xml = XElement.Load (@"myLovelyXmlFile.xml");
Console.Writeline(xml.Descendants("TxId").First().Value);
预期结果为 FirstTxId,但没有任何结果。
您没有得到结果,因为 Document
标签中有一个命名空间。
要解决此问题,请声明一个命名空间并将其 "add" 到元素的名称:
XNamespace ns = "urn:com.dovetailsystems:dps-if-gfc-request.001";
Console.WriteLine(xml.Descendants(ns + "TxId").First().Value);
此代码会将 "FirstTxId" 打印到控制台。
您也可以暂时删除命名空间(删除后,不要保存文档或在保存前再次添加):
public static void RemoveNamespace(this XElement container)
{
container.DescendantsAndSelf().Attributes().Where(x => x.IsNamespaceDeclaration).Remove();
foreach (var elem in container.DescendantsAndSelf())
elem.Name = elem.Name.LocalName;
}
此扩展方法的用法:xml.Root.RemoveNamespace();
删除后,您的原始代码应该可以正常工作。
不幸的是,似乎没有办法忽略命名空间;所以无论是添加还是删除它都必须做到这一点...
此代码可以帮助您:
XmlDocument document = new XmlDocument();
document.Load("YOUR_PATH");
var x= document.GetElementsByTagName("TxId").Item(0);
document.GetElementsByTagName 获取您只想要第一个子节点的节点集合。所以我们选择 Item(0).
我有这个简单的 xml 文件:
<Document xmlns="urn:com.place:dps-if-gfc-request.001">
<ReqHdr>
<MsgId>IE1611240000000100000001</MsgId>
<CreDtTm>2016-11-24T10:14:33.327Z</CreDtTm>
<AppInstanceId>DPSH</AppInstanceId>
<TxId>FirstTxId</TxId>
</ReqHdr>
<ReqTxInf>
<PmtId>
<TxId>SecondTxId</TxId>
</PmtId>
<MsgTyp>Request</MsgTyp>
<CtgyPurp>
<Prtry>ECRI</Prtry>
</CtgyPurp>
</ReqTxInf>
</Document>
我正在尝试获取第一个元素的内容:
var xml = XElement.Load (@"myLovelyXmlFile.xml");
Console.Writeline(xml.Descendants("TxId").First().Value);
预期结果为 FirstTxId,但没有任何结果。
您没有得到结果,因为 Document
标签中有一个命名空间。
要解决此问题,请声明一个命名空间并将其 "add" 到元素的名称:
XNamespace ns = "urn:com.dovetailsystems:dps-if-gfc-request.001";
Console.WriteLine(xml.Descendants(ns + "TxId").First().Value);
此代码会将 "FirstTxId" 打印到控制台。
您也可以暂时删除命名空间(删除后,不要保存文档或在保存前再次添加):
public static void RemoveNamespace(this XElement container)
{
container.DescendantsAndSelf().Attributes().Where(x => x.IsNamespaceDeclaration).Remove();
foreach (var elem in container.DescendantsAndSelf())
elem.Name = elem.Name.LocalName;
}
此扩展方法的用法:xml.Root.RemoveNamespace();
删除后,您的原始代码应该可以正常工作。
不幸的是,似乎没有办法忽略命名空间;所以无论是添加还是删除它都必须做到这一点...
此代码可以帮助您:
XmlDocument document = new XmlDocument();
document.Load("YOUR_PATH");
var x= document.GetElementsByTagName("TxId").Item(0);
document.GetElementsByTagName 获取您只想要第一个子节点的节点集合。所以我们选择 Item(0).