c# XmlWriter命名空间问题

本文关键字:问题 命名空间 XmlWriter | 更新日期: 2023-09-27 18:05:11

我正在使用XmlWriter,我正在努力创建以下XML标记。

<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标记。

有人能帮忙吗?

(注:

由于我需要创建的XML文件的大小,我需要使用XmlWriter。)

c# XmlWriter命名空间问题

这看起来很混乱。如果我们依次浏览每一行:

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");

请参阅下面的示例。这省去了可选的名称空间声明属性,以显示它们仍然被添加。