扩展XML验证/自动完成

时间:2012-05-23 12:03:30

标签: java xml eclipse

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

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

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

或Java-class

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。)
  • 提供代码完成 (在输入TypeA
  • 时建议TypeBtype="

我当然要编写一些代码,但最好的方法是什么?

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

4 个答案:

答案 0 :(得分:0)

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

检查Here验证XML

答案 1 :(得分:0)

您可以为XSD个文件编写XML架构,然后Eclipse可以验证它们。

肯定有框架会从您的XSD类生成Java架构。

在此处查看答案:utility to generate xsd from java class

答案 2 :(得分:0)

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

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

答案 3 :(得分: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的交互而言,你应该在方法 getPossibleValuesFromXML() getPossibleValuesFromJavaClass中实现从外部XML文件或java类收集值的特定逻辑。 ()

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

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 的源代码作为示例。

在自由世界中继续摇滚吧! :)