Я использую кусок кода для записи 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
Рассмотрите отступ в правильном направлении, свой код, определение элемента, все. Это будет не только легче читать, но также будет легче выявить любые потенциальные проблемы в том, как он настроен. –
Прежде всего, XDocument не может быть быстрее XmlWriter, потому что XmlWriter создает поточную запись XML-данных, а XDocument создает XML-данные в качестве объектной модели в памяти. –
Не может иметь цикл for в объявлении/конструкторе объекта, например. 'new XElement (" blah ", for (int i ....' –