繁体   English   中英

扩展XML验证/自动完成

[英]Extending XML validation / auto-completion

我有几种类型的数据源,我想将其用于其他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。)
  • 提供代码 TypeA (键入type="时,建议使用TypeATypeB

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

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

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

检查此处以验证XML

您可以为XML文件编写XSD模式,然后Eclipse可以对其进行验证。

当然,有一些框架可以从您的Java类生成XSD模式。

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

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

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

彼得,

由于我的评论空间不足,因此我在新帖子中回答了您。

如果您想根据您的示例扩展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的源代码作为示例。

在自由世界中继续前进! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM