C# XmlWriter 命名空间问题
C# XmlWriter namespace issues
我正在使用 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 标签。
有人可以帮忙吗?
(P.S。由于我需要创建的 XML 个文件的大小,我需要使用 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
自动处理 - 如果您想控制它们以何种顺序出现在 and/or 中的哪个元素,您通常只会明确地写入它们。
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。这省略了可选的命名空间声明属性,以表明它们仍然被添加。
我正在使用 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 标签。
有人可以帮忙吗?
(P.S。由于我需要创建的 XML 个文件的大小,我需要使用 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
自动处理 - 如果您想控制它们以何种顺序出现在 and/or 中的哪个元素,您通常只会明确地写入它们。
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。这省略了可选的命名空间声明属性,以表明它们仍然被添加。