2016-09-01 9 views
0

Я использую XmlWriter, и я изо всех сил пытаюсь создать следующий тег XML.C# XmlWriter проблемы с пространством имен

<mzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0_idx.xsd" version="1.1"> 

У меня есть следующие:

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

XmlWriter xmlWriter = XmlWriter.Create(xmlFilePath, settings); 

xmlWriter.WriteStartDocument(); 

xmlWriter.WriteStartElement("mzML", "xmlns", @"http://psi.hupo.org/ms/mzml"); 

xmlWriter.WriteAttributeString("xsi", "xmlns", @"http://www.w3.org/2001/XMLSchema-instance"); 

xmlWriter.WriteAttributeString("schemaLocation", "xsi", @"http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd"); 

xmlWriter.WriteAttributeString("version", "1.1"); 

xmlWriter.WriteEndElement(); 

xmlWriter.WriteEndDocument(); 

xmlWriter.Close(); 

, что приводит к следующему:

<mzML:xmlns p1:xsi="http://www.w3.org/2001/XMLSchema-instance" p2:schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd" version="1.1.0" xmlns:p2="xsi" xmlns:p1="xmlns" xmlns:mzML="http://psi.hupo.org/ms/mzml"> 

документация путает меня; Я пробовал много вариантов кода выше, но, похоже, не мог приблизиться к моему целевому тегу XML.

Может ли кто-нибудь помочь?

(постскриптум мне нужно использовать XmlWriter из-за размера файлов XML мне нужно создать.)

ответ

1

Это кажется совершенно запутался. Если мы проходим через каждую линию, в свою очередь:

xmlWriter.WriteStartElement("mzML", "xmlns", @"http://psi.hupo.org/ms/mzml"); 

Это определяет ваш элемент имеет префикс mzML и локальное имя xmlns и пространство имен http://.... У вашего элемента нет префикса, а локальное имя должно быть mzML.

xmlWriter.WriteAttributeString("xsi", "xmlns", 
    @"http://www.w3.org/2001/XMLSchema-instance"); 

Об этом пишет атрибут с префиксом xsi и пространства имен xmlns. Это объявление пространства имен: оно имеет префикс xmlns, локальное имя xsi, а пространство имен должно быть null. Я также хотел бы отметить, что при написании атрибутов объявления пространства имен будет автоматически обрабатываться XmlWriter - вы, как правило, просто пишите их явно, если хотите контролировать, какой элемент они встречаются и/или в каком порядке.

xmlWriter.WriteAttributeString("schemaLocation", "xsi", 
    @"http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd"); 

Об этом пишет атрибут с именем schemaLocation (правильный) и пространства имен xsi. Это неверно, пространство имен - http://www.w3.org/2001/XMLSchema-instance.

xmlWriter.WriteAttributeString("version", "1.1"); 

Это правильно.

Положив все эти изменения вместе:

xmlWriter.WriteStartElement("mzML", @"http://psi.hupo.org/ms/mzml"); 

// these two lines are optional - the namespace declarations are 
// automatically inserted as the *last* attributes when omitted 
xmlWriter.WriteAttributeString("xmlns", null, null, "http://psi.hupo.org/ms/mzml"); 

xmlWriter.WriteAttributeString("xmlns", "xsi", null, 
    "http://www.w3.org/2001/XMLSchema-instance"); 

xmlWriter.WriteAttributeString("xsi", "schemaLocation", 
    "http://www.w3.org/2001/XMLSchema-instance", 
    "http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd"); 

xmlWriter.WriteAttributeString("version", "1.1"); 

См this fiddle для рабочей демонстрации. Это исключает дополнительные атрибуты объявления пространства имен, чтобы показать, что они все еще добавлены.

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

  • Нет связанных вопросов^_^