簡體   English   中英

(Linq To)XML在路徑中添加所有不存在的元素

[英](Linq To) XML add all the elements in path that don't exist

我有一個看起來像這樣的XML模式:

<InnerNodeType1 Name="...">
 <InnerNodeType2 Name="...">
  <Leaf ID="..." />
 </InnerNodeType2>
</InnerNodeType1>

InnerNodeType1InnerNodeType2可以嵌套為:

<InnerNodeType1 Name="...">
 <InnerNodeType1 Name="...">
  <InnerNodeType1 Name="...">
   <InnerNodeType2 Name="...">
    <Leaf ID="..." />
   </InnerNodeType2 Name="...">
  </InnerNodeType1>
 </InnerNodeType1>
</InnerNodeType1>

始終存在的內容:

  • 路徑中至少有一個InnerNodeType1
  • 路徑中至少有一個InnerNodeType2
  • InnerNodeType2只有一個LeafNode
  • 內部節點只有2種類型

基本上是這樣的路徑: InnerNodeType1\\...\\InnerNodeType1\\InnerNodeType2\\...\\InnerNodeType2\\Leaf

給定3個字符串,其中包括:InnerNodeType1的路徑,InnerNodeType2的路徑和葉子,我想在XML文件中添加缺少的元素。 如果路徑的某些部分已經存在,則只需添加新元素作為子節點。

如何使用C#和(Linq to)XML做到這一點?

謝謝

您是否只想添加路徑中給定的元素節點? 如果我對您的理解正確,那么可以按照以下步驟進行操作:

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = new XDocument();
        Add(doc, @"root\cont1", "cont2", "leaf");
        Add(doc.Root, @"cont1\cont1", "cont2", "leaf");
        Add(doc.Root, "cont1", "cont2", "leaf");
        Add(doc.Root, @"cont1\cont1\cont1\cont1", @"cont2\cont2", "leaf");

        doc.Save(Console.Out);
    }
    static void Add(XContainer cont, string path1, string path2, string path3)
    {
        Add(cont, path1 + "\\" + path2 + "\\" + path3);
    }

    static void Add(XContainer cont, string path)
    {
        Add(cont, path.Split('\\'));
    }

    private static void Add(XContainer cont, IEnumerable<string> names)
    {
        XName name = names.FirstOrDefault();
        if (name == null)
        {
            return;
        }
        XContainer child = cont.Element(name);
        if (child == null)
        {
            child = new XElement(name);
            cont.Add(child);
        }
        Add(child, names.Skip(1));
    }
}

輸出以下XML:

<root>
  <cont1>
    <cont2>
      <leaf />
    </cont2>
    <cont1>
      <cont2>
        <leaf />
      </cont2>
      <cont1>
        <cont1>
          <cont2>
            <cont2>
              <leaf />
            </cont2>
          </cont2>
        </cont1>
      </cont1>
    </cont1>
  </cont1>
</root>

這絕不會檢查是否確保了某些元素的名稱和數量上的條件,只是添加了不存在的條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM