簡體   English   中英

C# 從 XML 獲取特定元素

[英]C# getting specific elements from XML

如何從此 XML 文件中獲取指定的元素? 假設我只想要標簽末尾的 sub11、sub12 等部分,這些部分可能包含 SUB**、每個標簽中的任何內容或其他內容到數組中?

另外,即使一個 Ex 下有兩個標簽,我怎么能得到每個標簽的 Ex 名稱? 如果我要寫一行來列出,我會想要 Ex 名稱,然后是所有標簽信息。 像第一行示例:test1, Subject1, SUB11, 80, SUB12, 31, SUB13, 2 列表行中第一個 EX 的示例輸出。 第二個應該是:test2, Subject2, SUB21, 100, SUB22, 20, SUB23, 0 第三個:test2, Subject3, SUB31, etc...

我有從 xml 文件獲取數據的實際經驗。 所以我不知道如何定位特定部分,即使你搜索了幾個小時關於如何定位 xml 節點、子節點等也沒有找到我想要的。

<Folder>
   <Ex>
      <Name>test1</Name>
      <Tags>
         <TagEx>
            <Name>Subject1</Name>
            <Tag Type="Maximum" Score="80" ExxTag="no">SUB11</Tag>
            <Tag Type="Average" Perc="31" ExxTag="no">SUB12</Tag>
            <Tag Type="Status" Results="2" ExxTag="no">SUB13</Tag>
         </TagEx>
      </Tags>
   </Ex>
   <Ex>
      <Name>test2</Name>
      <Tags>
         <TagEx>
            <Name>Subject2</Name>
            <Tag Type="Maximum" Score="100" ExxTag="no">SUB21</Tag>
            <Tag Type="Average" Perc="20" ExxTag="no">SUB22</Tag>
            <Tag Type="Status" Results="0" ExxTag="no">SUB23</Tag>
         </TagEx>
      </Tags>
      <Tags>
         <TagEx>
            <Name>Subject3</Name>
            <Tag Type="Maximum" Score="10" ExxTag="no">SUB31</Tag>
            <Tag Type="Average" Perc="50" ExxTag="no">SUB32</Tag>
            <Tag Type="Status" Results="3" ExxTag="no">SUB33</Tag>
         </TagEx>
      </Tags>
   </Ex>
</Folder>

我嘗試了幾種方法,但最終得到了完全不同的空值。

編輯:根據要求,我可以提供我嘗試過的內容,但在這種情況下它無濟於事,因為它幾乎無關緊要,因為我想像我現在所做的那樣針對某些而不是全部,但它是這樣的:

        var xmldoc = XDocument.Load(ExFile);

        foreach (var name in xmldoc.Descendants("TagEx").Elements()
                            .Select(x => new {
                                Value = x.Value,
                                Type = x.Attribute("Type"),
                                Score = x.Attribute("Score"),
                                Perc = x.Attribute("Perc"),
                                Rest = x.Attribute("Results"),
                                ExxTag = x.Attribute("ExxTag")
                            }))

    {

        if (name.Score != null)
        {
            DScore = name.Score.ToString();
    AScore.Add(ClearSTR(DScore));
        }
    for (int i = 0; i < AType1.Count; i++)
        {
        string[] row = { etc[i],AScore[i],etc[i],etc[i],etc[i],etc[i]};
        var listViewItem = new ListViewItem(row);
        ListViewData.Items.Add(listViewItem);
        }

EDIT2:我通過只收集所有 xml 數據而不是選擇我想要的數據然后按照接收項目的順序和值可能包含的可能性對它們進行循環排序來解決它。 它工作得很好,但不是我想要的。 我只是想選擇我想要的目標。 所以我不會將此添加為解決方案,因為我仍然很想知道如何從 xml 中選擇目標。

謝謝你的幫助!

試一試:

IEnumerable<IEnumerable<string>> data =
    from ex in XDocument.Parse(source).Root.Elements("Ex")
    let exname = ex.Element("Name").Value
    from tags in ex.Elements("Tags")
    let tagex = tags.Element("TagEx")
    let tagexname = tagex.Element("Name").Value
    let maximum =
        from tag in tagex.Elements("Tag")
        where tag.Attribute("Type").Value == "Maximum"
        select new [] { tag.Value, tag.Attribute("Score").Value }
    let average =
        from tag in tagex.Elements("Tag")
        where tag.Attribute("Type").Value == "Average"
        select new [] { tag.Value, tag.Attribute("Perc").Value }
    let status =
        from tag in tagex.Elements("Tag")
        where tag.Attribute("Type").Value == "Status"
        select new [] { tag.Value, tag.Attribute("Results").Value }
    let xs = maximum.Concat(average).Concat(status).SelectMany(x => x)
    select new [] { exname, tagexname, }.Concat(xs);

我得到:

test1, Subject1, SUB11, 80, SUB12, 31, SUB13, 2
test2, Subject2, SUB21, 100, SUB22, 20, SUB23, 0
test2, Subject3, SUB31, 10, SUB32, 50, SUB33, 3

暫無
暫無

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

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