【问题标题】:Creating XML with namespaces and schemas from an XElement从 XElement 创建带有名称空间和模式的 XML
【发布时间】:2010-09-25 00:13:16
【问题描述】:

一个冗长的问题 - 请耐心等待!

我想以编程方式创建一个带有命名空间和模式的 XML 文档。类似的东西

<myroot 
    xmlns="http://www.someurl.com/ns/myroot" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd">

    <sometag>somecontent</sometag>

</myroot>

我正在使用相当出色的新 LINQ 东西(这对我来说是新的),并希望使用 XElement 来完成上述工作。

我的对象上有一个 ToXElement() 方法:

  public XElement ToXElement()
  {
     XNamespace xnsp = "http://www.someurl.com/ns/myroot";

     XElement xe = new XElement(
        xnsp + "myroot",
           new XElement(xnsp + "sometag", "somecontent")
        );

     return xe;
  }

这给了我正确的命名空间,因此:

<myroot xmlns="http://www.someurl.com/ns/myroot">
   <sometag>somecontent</sometag>
</myroot>

我的问题:如何添加架构 xmlns:xsi 和 xsi:schemaLocation 属性?

(顺便说一句,我不能使用简单的 XAtttributes,因为在属性名称中使用冒号“:”时会出错...)

或者我需要使用 XDocument 或其他一些 LINQ 类吗?

谢谢...

【问题讨论】:

    标签: c# schema namespaces xelement


    【解决方案1】:

    从这个article 看来,您新建了多个 XNamespace,在根目录中添加了一个属性,然后带着两个 XNamespace 进入城镇。

    // The http://www.adventure-works.com namespace is forced to be the default namespace.
    XNamespace aw = "http://www.adventure-works.com";
    XNamespace fc = "www.fourthcoffee.com";
    XElement root = new XElement(aw + "Root",
        new XAttribute("xmlns", "http://www.adventure-works.com"),
    ///////////  I say, check out this line.
        new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
    ///////////
        new XElement(fc + "Child",
            new XElement(aw + "DifferentChild", "other content")
        ),
        new XElement(aw + "Child2", "c2 content"),
        new XElement(fc + "Child3", "c3 content")
    );
    Console.WriteLine(root);
    

    这是一个forum post,展示了如何进行架构定位。

    【讨论】:

      【解决方案2】:

      感谢 David B - 我不太确定我是否理解所有这些,但这段代码让我得到了我需要的东西......

        public XElement ToXElement()
        {
           const string ns = "http://www.someurl.com/ns/myroot";
           const string w3 = "http://wwww.w3.org/2001/XMLSchema-instance";
           const string schema_location = "http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd";
      
           XNamespace xnsp = ns;
           XNamespace w3nsp = w3;
      
           XElement xe = new XElement(xnsp + "myroot",
                 new XAttribute(XNamespace.Xmlns + "xsi", w3),
                 new XAttribute(w3nsp + "schemaLocation", schema_location),
                 new XElement(xnsp + "sometag", "somecontent")
              );
      
           return xe;
        }
      

      似乎连接命名空间和字符串,例如

      w3nsp + "schemaLocation"
      在生成的 XML 中给出了一个名为
      xsi:schemaLocation
      的属性,这正是我所需要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 2023-03-14
        相关资源
        最近更新 更多