2012-05-23 91 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方式编辑现有的答案。 –