2012-05-28 2 views
1

Я хочу, чтобы иметь возможность сделать что-то вроде этого:тир в начале XmlAttribute в C#

//buildArgs 
XmlNode buildArgs = doc.CreateElement("buildArgs"); 
XmlAttribute buildArgsAtt = doc.CreateAttribute("-D:project.rc_file"); 

Но я получаю ошибку благородных предшественников:

An unhandled exception of type 'System.ArgumentException' occurred in System.Xml.dll 

Additional information: Invalid name character in '-D'. The '-' character, hexadecimal value 0x2D, cannot be included in a name. 

Но я не выбирал формат , Я пытаюсь автоматизировать процесс добавления нового элемента в файл конфигурации cruisecontrol.net (ccnet.config). Поэтому мне нужно поставить эту черту.

Это мой код:

//create new instance of XmlDocument 
     XmlDocument doc = new XmlDocument(); 
     doc.PreserveWhitespace = false; 

     //load from file 
     doc.Load(filename); 

     //create node and add value 
     XmlNode projet = doc.CreateNode(XmlNodeType.Element, "projet", null); 
     XmlAttribute projetAtt = doc.CreateAttribute("name"); 
     projetAtt.Value = projectName + " " + oracleVersion; 
     projet.Attributes.SetNamedItem(projetAtt); 

     ... 

     //buildArgs 
     XmlNode buildArgs = doc.CreateElement("buildArgs"); 
     XmlAttribute buildArgsAtt = doc.CreateAttribute("-D:project.rc_file"); 
     buildArgsAtt.Value = projectName + ".rc"; 
     XmlAttribute buildArgsAtt2 = doc.CreateAttribute("-D:project.svn_trunk_ver"); 
     buildArgsAtt2.Value = trunkNb; 
     XmlAttribute buildArgsAtt3 = doc.CreateAttribute("-D:project.svn_trunk"); 
     buildArgsAtt3.Value = trunkPath; 
     buildArgs.Attributes.SetNamedItem(buildArgsAtt); 
     buildArgs.Attributes.SetNamedItem(buildArgsAtt2); 
     buildArgs.Attributes.SetNamedItem(buildArgsAtt3); 

     //add to parent node 
     projet.AppendChild(nodeWD); 
     projet.AppendChild(category); 
     projet.AppendChild(trigger); 
     trigger.AppendChild(intTrigger); 
     projet.AppendChild(sourcecontrol); 
     sourcecontrol.AppendChild(trunkUrl); 
     sourcecontrol.AppendChild(workingDirectory); 
     projet.AppendChild(tasks); 
     tasks.AppendChild(nant); 
     nant.AppendChild(targetList); 
     targetList.AppendChild(target); 
     nant.AppendChild(buildArgs); 

     //add to elements collection 
     doc.DocumentElement.AppendChild(projet); 

     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     settings.NewLineOnAttributes = true; 
     settings.Encoding = Encoding.UTF8; 

     using (XmlWriter writer = XmlTextWriter.Create(filename, settings)) 
     { 
      doc.Save(writer); 
     } 

Я проверил это: Using - in XML element name и другие, но я не нашел ответ, который я мог бы использовать.

-EDIT-

Это Exemple из ccnet.config: http://ccnet.sourceforge.net/CCNET/Configuring%20the%20Server.html

Спасибо!

ответ

1

Какая строка примера config? Вы имеете в виду это?

<buildArgs>-D:cvs.executable=c:\putty\cvswithplinkrsh.bat</buildArgs> 

Это не атрибут. Это элементный контент.

+0

Я попробую это как элемент. – LolCat

+0

Yup это работает. Благодаря !! – LolCat

3

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

Я уверен, что CruiseControl.Net тоже этого не делает, поскольку он не может использовать встроенный парсер в таком файле.

EDIT: это значение элемента (также называемое содержимым). Установите его следующим образом:

var buildArgs = doc.CreateElement("buildArgs"); 
buildArgs.Value = "-D:project.rc_file"; 
+0

Ну ... http://ccnet.sourceforge.net/CCNET/Configuring%20the%20Server.html Если вы посмотрите на , вы увидите черту D (-D) ... – LolCat

+0

Этот ответ также правильно, поскольку это был не атрибут, а элемент. Благодарю. – LolCat

+1

@LolCat ключевым моментом является не «элемент, а не атрибут» (поскольку имя, начинающееся с тире, все равно будет недействительным с элементом) - ключевым моментом является «это значение, а не имя» –