2016-02-15 2 views
0

Я использую кусок кода для записи XML-файла (используя LINQ) (использовал XMLWriter, и код становился слишком грязным, LINQ чище и, кажется, быстрее).Написание XML с использованием LINQ

Вопрос в том, что он пишет XML, но только в первую его часть - у меня есть другие утверждения внутри if, которые не записываются.

Я установил некоторые точки останова, где происходит if, и обнаружил, что все происходит там, как должно быть (переменные получают свои значения и т. Д.) - только XML не пишет.

В первой части кода вы можете заметить много закрывающих круглых скобок - без них я не могу заставить XML работать - или, если я попытаюсь изменить их порядок (например, закрыть раньше) при попытке конвертировать его говорит, что XML будет иметь недопустимый формат.

private void openXMLToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     string currentcolor; 
     XElement xmldoc = new XElement("JMF", 
      new XAttribute("SenderID", "InkZone-Controller"), 
      new XAttribute("version", "1.2"), 
     //new XAttribute("xmlns", "http://www.CIP4.org/JDFSchema_1_1"), 

     new XElement("Command", 
     new XAttribute("ID", "cmd.00695"), 
     new XAttribute("Type", "Resource"), 
     new XElement("ResourceCmdParams", 
     new XAttribute("Resourcename", "InkZoneProfile"), 
     new XAttribute("JobID", "K_41")), 

     new XElement("InkZoneProfile", 
     new XAttribute("ID", "r0013"), 
     new XAttribute("Class", "Parameter"), 
     new XAttribute("Locked", "False"), 
     new XAttribute("Status", "Available"), 
     new XAttribute("PartIDKeys", "SignatureName SheetName Side Separation"), 
     new XAttribute("DescriptiveName", "Schieberwerte von DI"), 
     new XAttribute("ZoneWidth", "32")), 

     new XElement("InkZoneProfile", 
     new XAttribute("SignatureName", "SIG1")), 

     new XElement("InkzoneProfile", 
     new XAttribute("Locked", "False"), 
     new XAttribute("Sheetname", "S1")), 

     new XElement("InkZoneProfile", 
     new XAttribute("Side", "Front")), 

       //Loop for getting black values and store them on XML 
        for(int i=0; i<stringsize; i++) 
         { 
          currentcolor = colors[i]; 
          if(currentcolor == "Black") 
           { 
            //Extracting numbers from blackzones 
            Regex regex1 = new Regex(@"HDMInkB \[(.*?)\]", 
             RegexOptions.Singleline | RegexOptions.Multiline); 
            var v1 = regex1.Match(hdmzones); 
            string blackzones = v1.Groups[1].ToString(); 
            //Converting to string - add a delimiter into each space 
            blackzones = Regex.Replace(blackzones, @"\s+", "|"); 
            Double[] numbers; //An array of Doubles - store numbers separated 
            string[] numbers_str = blackzones.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries); 
            numbers = new Double[numbers_str.Length]; 
            //Loop trough numbers 
             for (int j = 0; j < numbers.Length; j++) 
             { 
              numbers[j] = Double.Parse(numbers_str[j], CultureInfo.InvariantCulture); 
              //Converts each number on the string to a Double number, store it in a position 
              //in the Double array 
              numbers[j] = numbers[j]/100; //Needed calculus 
              numbers[j] = Math.Round(numbers[j], 3); //Storing numbers rounded 
             } 
            string blackvalues = String.Join(" ", numbers.Select(f => f.ToString())); 
       //Converting values back to string - so i can insert on the XML without problems 
       new XElement("InkZoneProfile", 
        new XAttribute("Separation", currentcolor), 
        new XAttribute("ZoneSettingsX", blackvalues)); 


      }//Closing BLACK if Statement 

         }//Closing for statement for XMLAttribute 
           //Saving XML Document 
           string strPath = Environment.GetFolderPath(
           System.Environment.SpecialFolder.DesktopDirectory); 

           string path2 = "new_xml.xml"; 
           string combined = Path.Combine(strPath, path2); 
           xmldoc.Save(combined); 


    }//Closing ConvertXML 
+2

Рассмотрите отступ в правильном направлении, свой код, определение элемента, все. Это будет не только легче читать, но также будет легче выявить любые потенциальные проблемы в том, как он настроен. –

+0

Прежде всего, XDocument не может быть быстрее XmlWriter, потому что XmlWriter создает поточную запись XML-данных, а XDocument создает XML-данные в качестве объектной модели в памяти. –

+0

Не может иметь цикл for в объявлении/конструкторе объекта, например. 'new XElement (" blah ", for (int i ....' –

ответ

0

Ваш код кажется отсутствующим частям. Как бы то ни было, я не думаю, что он мог даже скомпилировать. Отступ некогерентен, и некоторые из переменных даже не определены, поэтому трудно понять, где на самом деле лежит ваша проблема.

Тем не менее, я думаю, что я знаю трюк, который поможет вам привести ваши элементы в порядок. Вы можете использовать отдельный частный метод для получения всех необходимых элементов в соответствии с заданным списком цветов.

private IEnumerable<XElement> GetBlackvaluesElements(string hdmzones, params string[] colors) 
{ 
    for (int i = 0; i < colors.Length; i++) 
    { 
     currentColor = color[i]; 
     if (currentColor = "Black") 
     { 
      /* Regex, Calculus & other stuff to get string blackvalues here */ 
      yield return new XElement("InkZoneProfile", 
       new XAttribute("Separation", currentColor), 
       new XAttribute("ZoneSettingsX", blackvalues)); 
     } 
    } 
} 

private void OpenXMLToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    var commandElement = new XElement("Command"); 
    /* Add hardcoded elements to commandElement here */ 
    // Adding blackvalues to commandElement 
    commandElement.Add(GetBlackvaluesElements(hdmzones, colors).ToArray()); 

    var xmldoc = new XElement("JMF", 
     /* add required attributes here */ 
     commandElement); 

    /* Save document here */ 
} 
+0

Я попробую. Спасибо, ваш ответ и помощь. –

+0

Я изменил все на xmlwriter - получив другой вид ошибки, опубликует его в других вопросах. Спасибо. –