C#with XDocument和xsi:schemaLocation

时间:2015-06-26 06:55:34

标签: c# xml linq-to-xml linq-to-xsd xnamespace

我想创建以下XML。

<?xml version="1.0" encoding="utf-8"?>
<MyNode xsi:schemaLocation="https://MyScheme.com/v1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://MyScheme.com/v1-0 Sscheme.xsd">
  <MyInfo>
    <MyNumber>string1</MyNumber>
    <MyName>string2</MyName>
    <MyAddress>string3</MyAddress>
  </MyInfo>
  <MyInfo2>
    <FirstName>string4</FirstName>
  </MyInfo2>
</MyNode>

我正在使用此代码。

    XNamespace xmlns = "https://MyScheme.com/v1-0 Sscheme.xsd";
    XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
    XNamespace schemaLocation = XNamespace.Get("https://MyScheme.com/v1-0");

    XDocument xmlDocument = new XDocument(
         new XElement(xmlns + "MyNode",
             new XAttribute(xsi + "schemaLocation", schemaLocation),
             new XAttribute(XNamespace.Xmlns + "xsi", xsi),
             new XElement("MyInfo",
                 new XElement("MyNumber", "string1"),
                 new XElement("MyName", "string2"),
                 new XElement("MyAddress", "string3")
                 ),
                 new XElement("MyInfo2",
                     new XElement("FirstName", "string4")
                     )
         )
     );
    xmlDocument.Save("C:\\MyXml.xml");

然而,我得到了xmlns =&#34;&#34;内部标签MyInfo和MyInfo2。

有人可以帮我创建正确的XML吗?

1 个答案:

答案 0 :(得分:1)

您需要对所有元素使用XNamespace XDocument xmlDocument = new XDocument( new XElement(xmlns + "MyNode", new XAttribute(xsi + "schemaLocation", schemaLocation), new XAttribute(XNamespace.Xmlns + "xsi", xsi), new XElement(xmlns+"MyInfo", new XElement(xmlns+"MyNumber", "string1"), new XElement(xmlns+"MyName", "string2"), new XElement(xmlns+"MyAddress", "string3") ), new XElement(xmlns+"MyInfo2", new XElement(xmlns+"FirstName", "string4") ) ) ); ,因为这是默认命名空间,并且它在根级别元素处声明。请注意,除非另有说明,否则后代元素会隐式继承祖先默认命名空间:

class Character {
   constructor(){
     if(Object.getPrototypeOf(this) === Character.prototype){
       console.log('invoke character');
     }
   }
}


class Hero extends Character{
  constructor(){
      super(); // throws exception when not called
      console.log('invoke hero');
  }
}
var hero = new Hero();

console.log('now let\'s invoke Character');
var char = new Character();

<强> Dotnetfiddle Demo