2010-01-27 3 views
2

Прежде всего, это мой код.Создание XML с C#

IEnumerable<XElement> targetDirectory = 
    from XElement e in workingXmlDocument.Descendants(wixNS + "Directory") 
    where e.Attribute("Id").Value == "TARGETDIR" 
    select e; 
foreach (var now in targetDirectory) 
{ 
    now.Add(XElement.Parse("<Directory Id='" + fileVariable.Directory.Name 
              + @"' />")); 
} 

Вот что я пытаюсь сделать. Я пытаюсь найти каждый элемент Directory с атрибутом Id, оцененным в TARGETDIR. Затем я помещаю новый элемент каталога внутри него с именем каталога файла. Он делает именно это. Проблема в том, что он просто помещает все каталоги в одну строку (без разрыва строки, без отступа, ничего, только с необработанными данными), и включает в себя пустой тег xmlns с каждым элементом. Как я могу сказать, что каждый элемент должен иметь собственную строку в документе XML и как я могу сказать, что он использует то же пространство имен, что и остальная часть документа? Я знаю, что могу просто сказать, что он должен иметь атрибут xmlns с правильным NS, но это последнее, что я хочу сделать. идеи?

Update - код для XML Writer

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 
settings.NewLineHandling = NewLineHandling.Entitize; 

using (XmlWriter currentWriter = XmlWriter.Create(filePath, settings)) 
{ 
    workingXmlDocument.WriteTo(currentWriter); 
    currentWriter.Flush(); 
} // using (XmlWriter xw = XmlWriter.Create(FilePath)) 

отсюда не добавляя новые строки к прилагаемому элементов из приведенного выше кода.

+0

(Я переформатировал, чтобы было ясно, что цикл foreach не является частью запроса.) –

+0

@Jon Skeet - спасибо за это – Adkins

+0

Почему это последнее, что вы хотите сделать? Это как работает XML. –

ответ

2

Я бы написал цикл следующим образом, предоставив пространство имен. Это должно создавать узлы по своему усмотрению.

foreach (var now in targetDirectory) 
{ 
    now.Add(new XElement(
     wixNS + "Directory", 
     new XAttribute("Id", fileVariable.Directory.Name)); 
} 

Я предполагаю, что здесь wixNS является экземпляром XNamespace, такие как:

XNamespace wixNS = "http://schemas.microsoft.com/wix/2003/01/wi"; 

Я не знаю, почему отступов не работает.

+0

Спасибо. Это устранило проблему с пространством имен. Но как улучшить форматирование вывода. Все элементы, созданные в этом цикле, просто помещены на одну строку – Adkins

+0

, презумпция правильная. – Adkins

+0

@Update - У меня уже есть это с моим писателем. Я добавлю код для моего автора в исходное сообщение. – Adkins

Смежные вопросы