如何让LinqToXSD正确输出名称空间前缀声明?

我正在尝试使用LinqToXSD创建XML数据绑定类和包含许多导入模式的XML模式。 所有模式都位于此处。

为此,我使用了以下根模式文档:

               Tmats Root    

我使用Linq到XSD创建了类。 然后我写了以下测试:

 [TestMethod()] public void TmatsXmlExample4() { Tmats tmats = new Tmats { ProgramName = "My Program", OriginationDate = DateTime.Now, }; tmats.PointOfContact.Add(new PointOfContactType { Address = "12345 Anywhere Street", Agency = "My Agency", Name = "Robert Harvey", Telephone = "111-222-3333" }); Debug.Print(tmats.ToString()); } 

我期望输出看起来像这样:

  My Program 2012-05-09-07:00  Robert Harvey My Agency 12345 Anywhere Street 111-222-3333   

相反,我得到的是这样的:

  My Program 2012-05-09-07:00  Robert Harvey My Agency 
12345 Anywhere Street
111-222-3333

有没有办法让LinqToXSD产生预期的输出?

您应该映射每个导入的模式:

   

elementFormDefault仅适用于它所在的模式,并且不会覆盖任何包含或导入中的设置。

如果要隐藏名称空间,则所有模式都必须指定elementFormDefault =“ unqualified ”。 同样,如果要公开名称空间,则每个模式都必须指定elementFormDefault =“ qualified

审查unit testing后更新

你的意见:

  My Project 2012-05-15 

你的输出:

   My Project 2012-05-15 

突出的问题是标签的重复 – 一切看起来都不错,仍在努力理解为什么会发生这种情况。

星期一更新:

我认为LinqToXSD工具中存在一个错误 – 我已经完成了我能想到的每一个组合,并且不能始终如一地解决您的问题,但是……我已经设法修复了重复问题:

在XmlHelper文件中,更改return语句:

 System.Xml.Linq.XDocument xd = System.Xml.Linq.XDocument.Parse(sb.ToString()); return xd.Root.FirstNode.ToString(); 

我知道这是一个黑客 ,但它修复了问题,你的LoopbackTest通过。

如果使用Tmats类创建元素,则不会获得任何前缀,我尝试了各种属性组合,我可以做的最好是重新附加名称空间。 如果您正在与外部系统交换信息,那么我确实有一个修复

  1. 在代码中使用Tmats对象,
  2. 使用命名空间序列化它,
  3. 通过XSLT运行它以将ns映射到前缀。

我知道它很笨重,但我认为它是最好的,你将无法实际修复LinqToXSD代码。

XSLT将名称空间映射到前缀(您需要在’stylesheet’声明中以及’mapper’中维护名称空间集:

                               

生产:

  My Program 2012-05-09-07:00  Robert Harvey My Agency 12345 Anywhere Street 111-222-3333   

好的,所以这远非理想,但只有当你需要与其他人交互时你的代码才能在项目内部运行良好,你需要修改xml输出(记得改变elementFormDefault =“qualified” (或删除)它在您的XSD中) – 如果您将XSLT缓存为XslCompiledTransform您几乎没有注意到它发生了。