c# Xdocument和同名的后代不能工作
本文关键字:后代 不能 工作 Xdocument | 更新日期: 2023-09-27 18:03:10
我有以下具有相同事务名称的XML(不能更改它,因为它是如何从起源来的):
<StoreCenter Operation="update" xmlns="http://something.com/rdc.xsd">
<Transaction>
<Transaction>
<StoreID>30</StoreID>
<TransactionID>2</TransactionID>
<RegisterTransNumber>2</RegisterTransNumber>
....
</Transaction>
<Transaction>
<StoreID>30</StoreID>
<TransactionID>3</TransactionID>
<RegisterTransNumber>2</RegisterTransNumber>
....
<Transaction>
<Transaction>
<StoreCenter>
我有以下代码,我是新的LINQ,我试图检索每个事务子的StoreID:
XDocument Doc = XDocument.Load(filename);
XNamespace ns = "http://something.com/rdc.xsd";
foreach (var StoreCenter in Doc.Descendants(ns + "StoreCenter"))
{
foreach (var Transaction in StoreCenter.Descendants("Transaction"))
{
foreach (var TransactionCh in Transaction.Descendants("Transaction"))
{
Console.WriteLine(Transaction.Element("StoreID").Value);
}
}
}
但是我什么也没得到,我做错了什么?,这是检索这些值的好方法吗?,请多多指教
去掉这里的大括号:
Doc.Descendants("{" + ns + "StoreCenter")
^^^
您还应该使用子元素指定名称空间。如:StoreCenter.Descendants(ns + "Transaction")
和Transaction.Descendants(ns + "Transaction")
如果你只是想获得Transaction
元素,你可以只到:Doc.Descendants(ns + "Transaction")
或Doc.Root.Element(ns + "Transaction").Elements(ns + "Transaction");
(假设StoreCenter是根元素)
如果您的XML正确关闭(我假设示例XML中的Transaction
和StoreCenter
节点已关闭),那么-是的,您使用LINQ2XML的方法是正确的。
您可以使用XElement.GetDefaultNamespace()方法增强代码,以便轻松检索默认名称空间(比键入更容易)。解决方案可能像这样:
var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<StoreCenter Operation=""update"" xmlns=""http://something.com/rdc.xsd"">
<Transaction>
<Transaction>
<StoreID>30</StoreID>
<TransactionID>2</TransactionID>
<RegisterTransNumber>2</RegisterTransNumber>
</Transaction>
<Transaction>
<StoreID>30</StoreID>
<TransactionID>3</TransactionID>
<RegisterTransNumber>2</RegisterTransNumber>
</Transaction>
</Transaction>
</StoreCenter>";
var xmlDocument = XDocument.Parse(xml); // or XDocument.Load(xml);
var ns = xmlDocument.Root.GetDefaultNamespace();
var transactions = xmlDocument
.Root // the StoreCenter root node
.Element(ns + "Transaction") // the enclosing Transaction node
.Elements(ns + "Transaction") // only Transaction subnodes
.ToList();
foreach (var transaction in transactions)
{
var storeId = transaction.Element(ns + "StoreID").Value;
Console.WriteLine(storeId);
}
输出为:
30
30