簡體   English   中英

XML XElement和循環

[英]XML XElement and loops

請幫助我修復導致此xml輸出的代碼段。

名為“ Frequency”和“ ScheduleType”的元素都卡在日程表的第一個元素下。 我該如何解決?

我正在從CSV類型的文件中讀取數據,然后根據位置和值將相關數據(或轉換后的值)添加到相關XML值中。

您會看到我盡可能使用建議的方法,但是由於必須使用其他CASE語句,所以我陷入了困境,因此我恢復使用LAST語句來嘗試查找正確的元素以繼續。

  <Schedules>
    <Schedule Number="1">
      <ScheduleName>Cumulative</ScheduleName>
      <BackupType>Cinc</BackupType>
      <Multiplexing>4</Multiplexing>
      <RetentionLevel>infinite</RetentionLevel>
      <ResidenceIsSLP>No</ResidenceIsSLP>
      <MultipleCopies>No</MultipleCopies>
      <ScheduleType />
      <Frequency>
        <Count>5</Count>
        <Unit>Days</Unit>
        <Count>2</Count>
        <Unit>Weeks</Unit>
        <Count>1</Count>
        <Unit>Days</Unit>
      </Frequency>
      <ScheduleType />
      <Frequency />
      <ScheduleType />
      <Frequency />
    </Schedule>
    <Schedule Number="2">
      <ScheduleName>Full</ScheduleName>
      <BackupType>Full</BackupType>
      <Multiplexing>4</Multiplexing>
      <RetentionLevel>infinite</RetentionLevel>
      <ResidenceIsSLP>No</ResidenceIsSLP>
      <MultipleCopies>No</MultipleCopies>
    </Schedule>
    <Schedule Number="3">
      <ScheduleName>Differential</ScheduleName>
      <BackupType>Diff</BackupType>
      <Multiplexing>4</Multiplexing>
      <RetentionLevel>2 weeks</RetentionLevel>
      <ResidenceIsSLP>No</ResidenceIsSLP>
      <MultipleCopies>No</MultipleCopies>
    </Schedule>
  </Schedules>

public XDocument PolicyAttributesSection()
{
    XDocument policies = XDocument.Load("C:\\Output Files\\testnbu.xml");

    policies.Element("NBUConfig").Add(new XElement("Policies"));
    using (TextFieldParser policy = new TextFieldParser("C:\\Input Files\\RAM\\bppllist.txt"))
    {
        string[] ignoreLines1 = { "NAMES", "KEY", "RCMD", "BCMD", "FOE", "SHAREGROUP", "APPLICATIONDEFINED", "SCHEDFOE" };
        policy.TextFieldType = FieldType.Delimited;
        policy.Delimiters = new string[] { " ", ",", ";" };
        policy.HasFieldsEnclosedInQuotes = true;
        policy.CommentTokens = ignoreLines1;
        policy.TrimWhiteSpace = true;

        string[] policyprops;
        int schedulenumber;

        while (!policy.EndOfData)
        {

             schedulenumber = 0;
            var pl = policies.Element("NBUConfig").Element("Policies").Elements("Policy");
            policyprops = policy.ReadFields();
            switch (policyprops[0])
            {
            case "SCHED":
                    schedulenumber++;
                    int scheduletypenumber;
                    bool schedparsed = int.TryParse((policyprops[2]), out scheduletypenumber);
                    string scheduletypename = ScheduleType_Lookup[(scheduletypenumber)];
                    int retlevel;
                    bool retparsed = int.TryParse((policyprops[5]), out retlevel);
                    string retentionperiod = (Retention_Lookup[(retlevel)]).ToString();
                    int isslp;
                    bool isslpparsed = int.TryParse((policyprops[17]), out isslp);
                    int copynumber;
                    bool copynumberparsed = int.TryParse((policyprops[12]), out copynumber);
                    if (copynumber > 0)
                    {
                        copynumber = 1;
                    }
                    pl.Last().Element("Schedules").Add(new XElement(("Schedule"), new XAttribute("Number", (schedulenumber)),
                    (new XElement("ScheduleName", policyprops[1])),
                    (new XElement("BackupType", (scheduletypename))),
                    (new XElement("Multiplexing", policyprops[3])),
                    (new XElement("RetentionLevel", (retentionperiod))),
                    (new XElement("ResidenceIsSLP", (yesno_lookup[(isslp)]))),
                    (new XElement("MultipleCopies", (yesno_lookup[(copynumber)])))));
                    pl.Last().Element("Schedules").Element("Schedule").Add(new XElement(("ScheduleType")));
                    switch (policyprops[11])
                    {
                        case "1":
                            pl.Last().Element("Schedules").Element("Schedule").Add(new XElement("Calendar", "Enabled"));
                            pl.Last().Element("Schedules").Element("Schedule").Add
                    (new XElement("CalendarRetries", "Disabled"));
                            break;
                        case "2":
                            pl.Last().Element("Schedules").Element("Schedule").Add
                    (new XElement("Calendar", "Enabled"));
                            pl.Last().Element("Schedules").Element("Schedule").Add
                    (new XElement("CalendarRetries", "Enabled"));
                            break;
                        case "0":
                            int freqseconds;
                            bool startparsed = int.TryParse((policyprops[4]), out freqseconds);
                            var freq = frequency(freqseconds);
                            pl.Last().Element("Schedules").Element("Schedule").Add
                    (new XElement("Frequency"));
                            int count = freq.Item1;
                            string unit = freq.Item2;
                            pl.Last().Element("Schedules").Element("Schedule").Element("Frequency").Add
                    (new XElement("Count", (count).ToString()));
                            pl.Last().Element("Schedules").Element("Schedule").Element("Frequency").Add
                    (new XElement("Unit", (unit)));
                            break;
                    }
                    break;
            }
        }
        policies.Save("C:\\Output Files\\testnbu.xml");
        return policies;

這個語句是問題所在:

test.Element("NBUConfig")
    .Element("Policies")
    .Elements("Policy").Last()
    .Elements("Schedules").Last()
    .Element("Schedule")
    .Add(new XElement(("SchedulesStuff"), (scount)));

您正在將SchedulesStuff添加到最后一個Schedule元素中的第一個Schedules元素...,而不是將它添加到唯一的 Schedules元素中的最后一個 Schedule元素中。

如果您的重復性代碼少得多,那么所有這些代碼都將變得非常簡單得多,並且出錯率更低。 因此,請考慮:

var policies = new XElement("Policies");
var test = new XDocument(new XElement("NBUConfig", policies));

// Hint: for loops are more idiomatic than while loops here
for (int pcount = 0; pcount < 3; pcount++)
{
    var schedules = new XElement("Schedules");
    for (int scount = 0; scount < 3; scount++)
    {
        schedules.Add(new XElement("Schedule",
            new XAttribute("Number", scount),
            new XElement("ScheduleStuff", scount));
    }

    policies.Add(new XElement("Policy",
        new XElement("PolicyName", pcount),
        new XElement("General"),
        new XElement("Clients"),
        new XElement("IncludeList"),
        schedules));        
}

暫無
暫無

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

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