簡體   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