【问题标题】:C# XmlWriter namespace issuesC# XmlWriter 命名空间问题
【发布时间】:2016-09-01 09:11:34
【问题描述】:

我正在使用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 标记。

有人可以帮忙吗?

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

【问题讨论】:

    标签: c# xmlwriter


    【解决方案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 以获取工作演示。这省略了可选的命名空间声明属性以显示它们仍然被添加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2012-10-13
      相关资源
      最近更新 更多