扩展Visual Studio 2017 XML编辑器

时间:2019-05-26 21:05:13

标签: visual-studio visual-studio-extensions

我正在尝试使用在Visual Studio解决方案中使用的一些XML配置文件来改善我们的工作流程。我认为我首先要解释我要完成的任务,然后再解释我已经尝试了几个小时而没有成功的一些想法。

问题

我正在使用在数据库中配置数据模型的系统,该模型还使用xml文件存储在磁盘上,然后在应用程序启动期间将它们同步。这是已同步内容的一部分:

数据类型

所有数据类型每种数据类型都保存在一个XML配置文件中,并且每种都有一些属性,例如Name和Key。所有数据类型都在同一文件夹中配置,例如:/ config / dataTypes

示例

textString.config

<?xml version="1.0" encoding="UTF-8" ?>
<DataType Key="a45c9a94-09d7-4df9-85e6-d6930abc6c12" Name="Textstring">

textArea.config

<?xml version="1.0" encoding="UTF-8" ?>
<DataType Key="b104788f-4e2f-4592-9387-8b3861bd8046" Name="Textarea">

实体类型

将这些视为具有X个属性的模型,每个属性均已配置并连接到数据类型。

示例

customer.config

<?xml version="1.0" encoding="UTF-8" ?>
<Entity>
<Properties>
  <Property Name="Firstname" TypeKey="a45c9a94-09d7-4df9-85e6-d6930abc6c12" />
  <Property Name="Lastname" TypeKey="a45c9a94-09d7-4df9-85e6-d6930abc6c12" />
  <Property Name="Description" TypeKey="b104788f-4e2f-4592-9387-8b3861bd8046" />
</Properties>
</Entity>

我的最终目标是在编辑实体类型时提供智能,以便在输入Property元素的“ TypeKey”属性时获得所有数据类型作为建议。最好在下拉列表中显示数据类型的名称,并在选择它时将GUID添加为TypeKey属性的值。我还想用鼠标(或其他方式)将GUID悬停时显示数据类型名称。

正如您可以在使用项目的过程中进行成像一样,可以添加新的数据类型,因此需要根据数据类型文件夹中的文件来动态运行智能感知。

我还应该提到,这些配置文件也可以从应用程序中的UI进行编辑,我无法控制它们的序列化方式,因此-文件中没有XML命名空间,它们看起来像上面的例子。

我们还有多个不同的VS解决方案,它们具有不同的数据类型和实体类型设置。因此,我们在每个项目中都需要独立的智能感知。

我尝试过的

我的第一个想法是创建一个VS扩展名,该扩展名根据数据类型文件夹中的文件创建一个动态XML Schema XSD文件。然后,VS将为项目中的XML文件提取XSD并将其用于XML文件,结果证明这仅适用于配置的名称空间(请记住,由于我无法控制外部应用程序,因此无法添加名称空间)。

要解决此问题,它可以在编辑文件时将架构文件手动添加到XML文件。 (例如:https://docs.microsoft.com/en-us/visualstudio/xml-tools/how-to-select-the-xml-schemas-to-use?view=vs-2019)。问题在于,需要为每个xml文件完成此操作,并且不存储设置。

然后,我开始尝试使用VS扩展,以尝试将此Schema自动配置为已打开的XML文件。原来,我很难获得打开XML文件时将其推送到“属性浏览器”的“配置对象”。我设法获得了一个事件处理程序设置,当XML文件成为“焦点”时触发了该事件处理程序设置,但是我被困在尝试从属性浏览器获取属性的过程。

我还尝试了另一种方法,该方法具有自定义的“代码完成”扩展名,但它在编辑时使UI感觉非常“混乱”。

花了大约10个小时来解决这个问题之后,我觉得我真的没有找到解决方案的好途径,因为我对VS-extensions的经验还不够广泛。

我希望获得一些有关如何解决此问题的反馈和想法,因为如果我走“动态”道路,那么XSD与每个项目都不相同,因为每个项目都有不同,所以我们无法使用全局VS设置因此,数据类型需要为TypeKey属性使用不同的允许值。

我正在考虑的一种方法是在Visual Studio的全局架构缓存中使用通用XSD(允许TypeKey的所有值),并仅为TypeKeys创建“代码完成”功能。

任何朝着正确方向的想法和指示将不胜感激。

0 个答案:

没有答案