您有以下具有相同交易名称的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的新代码,我试图为每个Transaction Child检索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);
}
}
}
但我一无所获,我做错了什么?,这是检索这些价值观的好方法吗?请您的意见将受到赞赏
答案 0 :(得分:1)
从这里删除大括号:
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是根元素)
答案 1 :(得分:0)
如果您的XML已正确关闭(我假设示例XML中的Transaction
和StoreCenter
节点已关闭),那么 - 是的,使用LINQ2XML的方法是正确的。
您可以使用XElement.GetDefaultNamespace() method增强代码,轻松检索默认命名空间(比输入更容易)。解决方案可能如下所示:
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