在创建XML时,XNamespace url是用XAttribute编写的

时间:2013-10-21 09:36:52

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

我正在使用命名空间创建XML但是url是用XAttribute元素而不是命名空间“prefix”编写的 这就是我得到的输出

<xmi:XMI xmlns:uml="http://www.omg.org/spec/UML/20110701"
         xmlns:xmi="http://www.omg.org/spec/XMI/20110701">   
   <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5" />  
       <uml:Model xmi:type="{http://www.omg.org/spec/UML/20110701}Model" name="EA_Model">
          <packagedElement xmi:type="{http://www.omg.org/spec/UML/20110701}Package" xmi:id="1212" name="Logical View">
          <packagedElement xmi:type="{http://www.omg.org/spec/UML/20110701}Class" xmi:id="35798" name="MyClass">

但我应该生成这样的东西..

<xmi:XMI xmlns:uml="http://www.omg.org/spec/UML/20110701"
         xmlns:xmi="http://www.omg.org/spec/XMI/20110701">   
   <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5" />  
       <uml:Model xmi:type="uml:Model" name="EA_Model">
          <packagedElement xmi:type="uml:Package" xmi:id="1212" name="Logical View">
          <packagedElement xmi:type="uml:Class" xmi:id="35798" name="MyClass">

我的代码:

XNamespace uml = "http://www.omg.org/spec/UML/20110701";
XNamespace xmi = "http://www.omg.org/spec/XMI/20110701";

XElement rootElement = new XElement(xmi + "XMI", new XAttribute(XNamespace.Xmlns + "uml", "http://www.omg.org/spec/UML/20110701"), new XAttribute(XNamespace.Xmlns + "xmi", "http://www.omg.org/spec/XMI/20110701"));
doc.Add(rootElement);

rootElement.Add(new XElement(xmi+"Documentation", new XAttribute("exporter", "Enterprise Architect"), new XAttribute("exporterVersion", "6.5")));

XElement modelNode = new XElement(uml + "Model", new XAttribute(xmi + "type", uml + "Model"), new XAttribute("name", "EA_Model"));
rootElement.Add(modelNode);

XElement logicalViewElement = new XElement("packagedElement", new XAttribute(xmi + "type", uml + "Package"), new XAttribute(xmi + "id", project.Id), new XAttribute("name", "Logical View"));
modelNode.Add(logicalViewElement);

Dictionary<string, XElement> entityNodes = new Dictionary<string, XElement>();
foreach (BusinessEntityDataObject entity in project.BusinessEntities)
{
    XElement entityElement = 
        new XElement("packagedElement", 
           new XAttribute(xmi+"type",uml+"Class"),
           new XAttribute(xmi+"id",entity.Id), 
           new XAttribute("name",entity.Name));

1 个答案:

答案 0 :(得分:0)

而不是将XNamespace与字符串值连接

 new XAttribute(xmi + "type", uml + "Class")

您应手动构建属性值:

 new XAttribute(xmi + "type", "uml:Class")

XAttribute构造函数有两个参数 - 第一个期望XName,第二个期望简单object。将XNamespacestring合并后,您会得到string结果,其结果类似xmi.ToString() + attributeName,等于"{http://www.omg.org/spec/XMI/20110701}type"。因此XNode类型定义了从字符串的隐式转换,此字符串可以转换为XName实例。

在第二种情况下,uml + "Class"也合并为字符串"{http://www.omg.org/spec/UML/20110701}Class"。但构造函数的第二个参数应该是object类型,并且此字符串满足该要求,因此没有任何内容转换为XName,并且您将组合字符串作为属性值。