繁体   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