xmlns属性不能作为属性添加到XML元素

时间:2019-08-12 16:19:51

标签: xml linq linq-to-xml xml-namespaces xattribute

我来找你是因为我有问题。

总而言之,当我尝试将值添加到Signature元素的xmlns属性中时,出现以下错误。

西班牙语

System.Xml.XmlException : 'No se puede volver a definir el prefijo '' de '' a 'http://www.w3.org/2000/09/xmldsig#' dentro de la misma etiqueta de elemento inicial.

或 英文

System.Xml.XmlException: 'The prefix' 'from' 'to' http://www.w3.org/2000/09/xmldsig# 'cannot be redefined within the same initial element tag.

我拥有的代码如下:

XNamespace _Xmlns = "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2";
XNamespace _Cac = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2";
XNamespace _Cbc = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2";
XNamespace _Ds = "http://www.w3.org/2000/09/xmldsig#";
XNamespace _Ext = "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2";
XNamespace _Xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace _Udt = "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2";
XNamespace _Qdt = "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2";
XDocument arbolXML = new XDocument(
new XDeclaration("1.0", "utf-8", "no"),
new XComment("este es un comentario"),
new XElement(
           _Xmlns + "Invoice",
            new XAttribute(XNamespace.Xmlns + "cac", _Cac.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "cbc", _Cbc.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "ds", _Ds.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "ext", _Ext.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "xsi", _Xsi.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "udt", _Udt.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "qdt", _Qdt.NamespaceName),
                    new XElement(_Ext + "UBLExtensions"
                    , new XElement(_Ext + "UBLExtension",
                            new XElement(_Ext + "ExtensionContent",
                                new XElement("Signature", new XAttribute("Id", "SignOpenInvoicePeru") //, new XAttribute("xmlns", "http://www.w3.org/2000/09/xmldsig#")
                                )
                            )
                      )
                    )
           )
);


string cadena = arbolXML.ToString();

哪个返回了以下XML结构:

<!--este es un comentario-->
<Invoice  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
    xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
    <ext:UBLExtensions>
        <ext:UBLExtension>
            <ext:ExtensionContent>
                <Signature Id="SignOpenInvoicePeru" xmlns="" />
            </ext:ExtensionContent>
            </ext:UBLExtension>
        </ext:UBLExtensions>
    </Invoice>

问题是xmlns属性出现并且为空,我希望它具有以下值

< Signature Id="SignOpenInvoicePeru" xmlns="http://www.w3.org/2000/09/xmldsig#" >

当我删除注释// //新的XAttribute(“ xmlns”,“ http://www.w3.org/2000/09/xmldsig#

我收到以下错误:

西班牙语

System.Xml.XmlException : 'No se puede volver a definir el prefijo '' de '' a 'http://www.w3.org/2000/09/xmldsig#' dentro de la misma etiqueta de elemento inicial.

或 英文

System.Xml.XmlException: 'The prefix' 'from' 'to' http://www.w3.org/2000/09/xmldsig# 'cannot be redefined within the same initial element tag.

我不知道为什么会收到该错误,但是请您在我的想法下需要您的支持。预先非常感谢。

1 个答案:

答案 0 :(得分:0)

如果签名元素应遵循命名空间http://www.w3.org/2000/09/xmldsig#,则应在其前面加上ds:,因为这是您在根文档中定义的命名空间。

   <ds:Signature Id="SignOpenInvoicePeru" />

使用

   new XElement(_Ds + "Signature", new XAttribute("Id", "SignOpenInvoicePeru")

也许我遗漏了一些东西,但是我认为在嵌套元素级别指定xmlns是不正确的,尤其是因为此命名空间已经在根元素中声明了。

   <Invoice xmlns:ds="http://www.w3.org/2000/09/xmldsig#"