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);
                 }
            }
        }

但是我什么也没得到,我做错了什么?,这是检索这些值的好方法吗?,请多多指教

c# Xdocument和同名的后代不能工作

去掉这里的大括号:

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