我有几种类型的数据源,我想用它来进行额外的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" />
现在我想通过
改进编辑此文件TypeA
)TypeB
和type="
我当然要编写一些代码,但最好的方法是什么?
答案 0 :(得分:0)
我很确定eclipse已经完成了这两件事,但它们是其中一个扩展包的一部分。尝试为Java EE开发人员下载eclipse。我非常确定验证和完成是Web工具平台的一部分。
检查Here验证XML
答案 1 :(得分:0)
您可以为XSD
个文件编写XML
架构,然后Eclipse
可以验证它们。
肯定有框架会从您的XSD
类生成Java
架构。
答案 2 :(得分:0)
如果您决定扩展Rinzo,似乎文档已经更新了如何扩展您想要自定义的相同功能:)
答案 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 的源代码作为示例。
在自由世界中继续摇滚吧! :)