我正在使用命名空间创建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));
答案 0 :(得分:0)
而不是将XNamespace与字符串值连接
new XAttribute(xmi + "type", uml + "Class")
您应手动构建属性值:
new XAttribute(xmi + "type", "uml:Class")
XAttribute
构造函数有两个参数 - 第一个期望XName
,第二个期望简单object
。将XNamespace
与string
合并后,您会得到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
,并且您将组合字符串作为属性值。