c#Xdocument和具有相同名称的后代无法正常工作

时间:2014-05-12 16:43:11

标签: c# linq

您有以下具有相同交易名称的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);
                 }

            }
        }

但我一无所获,我做错了什么?,这是检索这些价值观的好方法吗?请您的意见将受到赞赏

2 个答案:

答案 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中的TransactionStoreCenter节点已关闭),那么 - 是的,使用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