0

我有几种类型的数据源,我想将它们用于额外的 XML 验证并提供自动完成(如果可能,使用 Eclipse)。

此源可能是其他一些 XML(来自另一个或同一个文件):

<type name="TypeA"/>
<type name="TypeB"/>

或 Java 类

public List<String> getValues() {
    return Arrays.asList("Val1", "Val2", "Val3");
}

然后在其他 XML 文件中引用这些值:

<x type="TypeA" value="Val2" />
<x type="TypeB" value="Val3" />

现在我想改进编辑这个文件

  • 验证XML 文件(在错误的类型/值下划线,如果可能,在 Package Expl 中显示红色 x。)
  • 提供代码补全 (建议TypeATypeB输入时type="

我当然必须编写一些代码,但是最好的开始方式是什么?

  • 可以扩展标准 XML 编辑器吗?
  • 有没有可以提供帮助的插件?(也许是 Rinzo XML 编辑器?)
  • 还有其他我没有想到的选择吗?
4

4 回答 4

0

彼得,

我在新帖子中回答你,因为我没有足够的评论空间。

如果您想根据您的示例扩展 Rinzo,我想您需要创建一个插件来贡献站点文档中声明的扩展点。

对于内容助手的实现,我猜基于您的示例的粗略实现可能如下:

public class CustomSourceAssistProcessor implements IXMLContentAssistProcessor {
@Override
public void addAttributeValuesProposals(XMLNode currentNode, String attributeName, String prefix,
        ITextViewer viewer, int offset, Collection<ICompletionProposal> results) {
    if("x".equals(currentNode.getTagName()) && "type".equals(attributeName)) {
        for (String possibleValue : this.getPossibleValuesFromXML()) {
            results.add(new CompletionProposal(possibleValue, offset, prefix.length(), 0, null, "Proposal Description...", null, null));
        }
    }
    if("x".equals(currentNode.getTagName()) && "value".equals(attributeName)) {
        for (String possibleValue : this.getPossibleValuesFromJavaClass()) {
            results.add(new CompletionProposal(possibleValue, offset, prefix.length(), 0, null, "Proposal Description...", null, null));
        }
    }
}

}

就与 Rinzo 的 API 交互而言,您从外部 XML 文件或 java 类收集值的特定逻辑应在方法getPossibleValuesFromXML()getPossibleValuesFromJavaClass()中实现

另一方面,为了添加您的自定义验证器,我猜您的扩展点的粗略实现,也基于您的示例,应该类似于这个:

public class CustomSourceXMLValidator implements XmlValidator {
@Override
public void validate(RinzoXMLEditor editor) {
    editor.getModel().getTree().accept(new HierarchicalVisitor() {
        @Override
        public boolean visitStart(XMLNode node) {
            if(node.isTag() && "x".equals(node.getTagName())) {
                for (Entry<String, XMLAttribute> entry : node.getAttributes().entrySet()) {
                    if("type".equals(entry.getKey())) {
                        this.validateValueFromXML(entry.getValue().getValue());
                    }
                    if("value".equals(entry.getKey())) {
                        this.valdateValueFromJavaClass(entry.getValue().getValue());
                    }
                }
            }
            return true;
        }
        private void valdateValueFromJavaClass(XMLAttribute xmlAttribute) {
            if(!this.getPossibleValuesFromXML().contains(xmlAttribute.getValue())) {
                this.createMarker(editor, xmlAttribute);
            }
        }
        private void validateValueFromXML(XMLAttribute xmlAttribute) {
            if(!this.getPossibleValuesFromJavaClass().contains(xmlAttribute.getValue())) {
                this.createMarker(editor, xmlAttribute);
            }
        }
    });
}

}

再一次由你来决定getPossibleValuesFromXML()getPossibleValuesFromJavaClass()方法的实现。也可以看ClassNamesValidatorVisitor的源码为例。

在自由的世界里继续摇滚!:)

于 2012-05-30T21:03:17.223 回答
0

我很确定 eclipse 已经做了这两件事,但它们是扩展包之一的一部分。尝试为 Java EE 开发人员下载 eclipse。我相当肯定验证和完成是 Web 工具平台的一部分。

检查此处以验证 XML

于 2012-05-23T12:12:16.157 回答
0

您可以为文件编写XSD模式XML,然后Eclipse验证它们。

当然,有些框架会从您的类中生成XSD模式。Java

在此处查看答案:从 java 类生成 xsd 的实用程序

于 2012-05-23T12:27:51.897 回答
0

如果您决定扩展 Rinzo,似乎已经更新了有关如何扩展您想要自定义的相同功能的文档 :)

http://editorxml.sourceforge.net/extendingRinzo.html

于 2012-05-28T17:09:18.913 回答