[英]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" />
现在,我想通过以下方式改进对该文件的编辑
TypeA
(键入type="
时,建议使用TypeA
和TypeB
) 我当然必须编写一些代码,但是最好的开始方式是什么?
我很确定eclipse已经完成了这两项工作,但是它们是扩展软件包之一的一部分。 尝试为Java EE开发人员下载eclipse。 我相当确定,验证和完成是Web工具平台的一部分。
检查此处以验证XML
如果您决定扩展Rinzo,似乎有关如何扩展您想自定义的相同功能的文档已更新:)
彼得,
由于我的评论空间不足,因此我在新帖子中回答了您。
如果您想根据您的示例扩展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.