[英]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.