在Visual Studio中自动将XML文件附加到XSD架构?

时间:2009-12-28 22:27:19

标签: xml visual-studio xsd

我刚刚发现了Visual Studio自动生成XSD架构的美妙之处。*

是否有一种简单的方法让VS自动将具有特定名称的文件附加到现有XSD架构?因此,如果我在整个项目(或多个项目)中分散myconfig.xml个文件,我希望它们始终针对myconfig.xsd进行验证,而不是必须打开每个XML文件并手动关联它。这可能吗?

  

*对于那些不熟悉的人:Open XML文件,XML / Create Schema和   它创建了一个很好的模式文件基于   它在您的XML文件中看到了什么。您可以   然后将相同的XSD附加到另一个   打开该文件的XML文件   选择XML / Schemas并选择   来自项目的适当模式。然后,您将获得所有元素和属性名称,必需元素和属性等的智能感知和验证。


更新:我想我不是很清楚。

当我在项目中的任何位置创建新的web.config文件时,我不会手动为其分配架构。 XML中没有指定名称空间。然而,Visual Studio自动知道使用DotNetConfig.xsd

XML Schemas dialog screenshot

据推测,Visual Studio在某处可以将名为web.config的文件分配给DotNetConfig.xsd

现在,假设我希望名为DbSchema.xml的所有文件自动使用我创建的名为DbSchema.xsd的模式。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:5)

如果您的模式与XML文件位于同一工作区(不一定是项目),则只要您的文件具有名称空间声明,Visual Studio就会自动使用它们进行自动完成和验证。

您甚至不需要输入schemaLocation属性。

尝试以下方法:

  • 双击XML文件将其打开
  • 在动态显示的菜单项“XML”中,单击“Schemas ...”。这将显示从名称空间到模式的当前映射。

要检查它是否正常工作,请尝试在某处放置一个开放的尖括号,它应该建议元素名称。

编辑:这也适用于没有命名空间的XML文件,但是您可能需要向%Install%\ Xml \ Schemas as described here添加新的架构目录。在底部附近,它描述了如何使用“Association”元素通过扩展名关联模式。

答案 1 :(得分:1)

任何XML文档中的任何标记都可以引用模式。

请参阅此示例:http://msdn.microsoft.com/en-us/library/ms757863(VS.85).aspx

答案 2 :(得分:1)

使用时,添加名称如http //...../ xxx.xsd或../Common/xxx.xsd这样简单

<configuration>

  <configSections>
    <section name="RouteConfigSection" type="RouteSection.RouteConfigSection,RouteSection" />
  </configSections>

  <RouteConfigSection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="RouteConfigSection.xsd">
    <routes>...

同时

public class RouteConfigSection : ConfigurationSection
{
    [ConfigurationProperty("routes", IsDefaultCollection = false)]
    public RouteConfigElementCollection Routings { get { return (RouteConfigElementCollection)base["routes"]; } }

    //https://github.com/bspell1/NLogEx/blob/master/NLogEx.Mvc/Config/Config.cs
    [ConfigurationProperty("xmlns")]
    private String Ns1 { get { return null; } }

    [ConfigurationProperty("xmlns:xsi")]
    private String Ns2 { get { return null; } }

    [ConfigurationProperty("xsi:noNamespaceSchemaLocation")]
    private String Ns3 { get { return null; } }
}