XmlDocument - 前缀“”不能从“”重新定义为“X”

本文关键字:定义 前缀 不能 XmlDocument 新定义 | 更新日期: 2023-09-27 18:30:57

我正在这样做:

 var xml = new XmlDocument();
 xml.AppendChild(xml.CreateXmlDeclaration("1.0", Encoding.UTF8.BodyName, "yes"));
 var el = (XmlElement)xml.AppendChild(xml.CreateElement("Document"));           
 el.SetAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:" + SepaSchemaUtils.SepaSchemaToString(schema));

然后,为了使XML缩进,我这样做:

StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings
{
    Indent = true,
    IndentChars = "  ",
    NewLineChars = "'r'n",
    NewLineHandling = NewLineHandling.Replace
};
using (XmlWriter writer = XmlWriter.Create(sb, settings))
{
    doc.Save(writer);
}

当文档时,我收到异常。保存(编写器)被执行。

System.Xml.XmlException:前缀"不能从"重新定义为 'urn:iso:std:iso:20022:tech:xsd:pain.001.001.03' 在同一开头 元素标记。

我已经尝试了我能找到的一切。谢谢。

XmlDocument - 前缀“”不能从“”重新定义为“X”

您尝试创建不在命名空间中的 Document 元素,但同时设置默认命名空间。我怀疑你只是想要:

String ns = "urn:iso:std:iso:20022:tech:xsd:" + SepaSchemaUtils.SepaSchemaToString(schema);
var xml = new XmlDocument();
xml.AppendChild(xml.CreateXmlDeclaration("1.0", Encoding.UTF8.BodyName, "yes"));
var el = (XmlElement) xml.AppendChild(xml.CreateElement("Document", ns)); 
el.SetAttribute("xmlns", ns);

或者,我强烈建议使用 LINQ to XML,它使此任务和许多其他任务变得更加简单。

除了Jon Skeet的答我要补充一点,我觉得在使用 XML 时不需要 LINQ(如果有的话)。我使用一些简单的帮助程序函数管理命名空间。它们是我XmlDocUtil模块的一部分,我无法完整分享,只举一个小例子:

using System     ;
using System.Xml ;
using System.Text;
static class Test {
/* ------------------------------ XML helpers ------------------------------- */
static XmlDocument XParDoc( XmlNode parent  )
{   XmlDocument pardoc;
    if( parent.OwnerDocument == null ) pardoc = ( XmlDocument )parent;
    else                               pardoc = parent.OwnerDocument;
    return pardoc;
}
static XmlElement XAddTag
(   XmlNode parent,
    string  tag
)
{   return XAddTagNs( parent, tag, parent.NamespaceURI );  }
static XmlElement XAddTagNs( XmlNode parent, string name, string ns )
{   XmlElement elem;
    elem = XParDoc( parent ).CreateElement( name, ns );
    parent.AppendChild( elem );
    return elem;
}
/* ----------------------------- Demonstration ------------------------------ */
static void Main()
{   XmlDocument       doc;
    XmlNode           root, node;
    doc = new XmlDocument();
    // Add a tag with an explicitely specified namespace:
    root = XAddTagNs  ( doc , "root"         , "root/ns/uri"  );
    // Inherit the root namespace:
    node = XAddTag    ( root, "under_root"                    );
    node = XAddTag    ( node, "terminal_1"                    );
    // Add a tag with anoher namespace:
    node = XAddTagNs  ( root, "another"      , "other/ns/uri" );
    // Inherit that other namespace:
    node = XAddTag    ( node, "under_another"                 );
    // Add a tag without a namespace:
    node = XAddTagNs  ( root, "no_ns"        , null           );
    // ...and one under it:
    node = XAddTagNs  ( node, "under_no_ns"  , null           );
    // Print the result to console:
    Console.Write( XmlToStr( doc ) );
}
static string XmlToStr( XmlDocument doc )
{   StringBuilder     sb;
    XmlWriter         xw;
    XmlWriterSettings xw_sets;
    sb      = new StringBuilder();
    xw_sets = new XmlWriterSettings();
    xw_sets.Indent      = true;
    xw_sets.IndentChars = "  ";
    xw  = XmlWriter.Create( sb, xw_sets );
        doc.WriteTo( xw );
    xw.Dispose();
    return sb.ToString();
}
}

上面的程序打印:

<?xml version="1.0" encoding="utf-16"?>
<root xmlns="root/ns/uri">
  <under_root>
    <terminal_1 />
  </under_root>
  <another xmlns="other/ns/uri">
    <under_another />
  </another>
  <no_ns xmlns="">
    <under_no_ns />
  </no_ns>
</root>

这定义命名空间的方式是保存每个标签的命名空间prefix:的限定,并依靠自然命名空间继承来简化事情。