2012-05-23 131 views
0

我有幾種類型的數據源,我想用於其他XML驗證並提供自動完成(如果可能,使用Eclipse)。擴展XML驗證/自動完成

此源可以是一些其他的XML(從另一或同一文件):

<type name="TypeA"/> 
<type name="TypeB"/> 

或Java的類

public List<String> getValues() { 
    return Arrays.asList("Val1", "Val2", "Val3"); 
} 

這些值然後在其他XML引用-files:

<x type="TypeA" value="Val2" /> 
<x type="TypeB" value="Val3" /> 

現在我想改善

  • 編輯該文件驗證的XML的文件 (強調錯誤的類型/值,如果可能的話顯示紅色的X在包EXPL)
  • 提供代碼 - 完成 (建議TypeATypeB打字type="時)

我肯定會寫一些代碼,但最好的方法是什麼?

  • 是否可以擴展標準的XML編輯器?
  • 有什麼插件可以幫忙嗎? (也許Rinzo XML Editor?)
  • 任何其他選項,我沒有想到?

回答

0

我很確定eclipse已經完成了這兩件事,但它們是擴展包之一的一部分。嘗試爲Java EE開發人員下載eclipse。我相當確信驗證和完整性是Web Tools Platform的一部分。

檢查Here用於驗證XML

+0

謝謝,但我不是在談論檢查有效和良好的XML文件,但關於Eclipse可以不知道其他檢查。 –

0

你可以寫XSD模式爲您XML文件,然後Eclipse可以驗證他們。

確實有框架可以從您的Java類中生成XSD模式。

檢查這裏的答案:utility to generate xsd from java class

+0

謝謝,這是一個有趣的想法!如果可能的話,我想避免在源文件更改時重新生成我的xsd。 –

+0

我知道http://sourceforge.net/projects/jaxb-builder/爲另一方向代基於Java> XSD – adranale

+0

@PeterLang如果您發現使用'Maven'一個框架,可以讓在'Maven的產生情況'建立,但這不會幫助你完成代碼 – adranale

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進行交互,和您的特定邏輯收集從外部XML文件或Java的類值或者應在方法getPossibleValuesFromXML()getPossibleValuesFromJavaClass()

0來實現

上,以添加自定義驗證我想粗略實現擴展點的,還可根據您的例子。另一方面,應與此類似:

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的源代碼爲例。

繼續搖滾的自由世界! :)

+0

我只是想知道你是否有經驗,但謝謝你的樣品! ;-)你用過Rinzo嗎? BWT:不用添加新的答案,而是使用StackOverflow方式編輯現有的答案。 –