2

我想使用自定义验证器验证自定义内容类型文档(xml 种类)。想用 xsd 验证它,但只能在对主文档进行某些预处理之后。无法使用普通 xml 验证器,因为 - 1.) 主文档文件中未定义模式位置(xsd)和命名空间。2.) 第一个原因和更多的 bcz,想要在应用 xsd 验证之前对文档文件进行一些预处理。

所以我想使用 xml 验证器,但只能在我的文件预处理之后。

我的 plugin.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

<extension
point="org.eclipse.core.runtime.contentTypes">

<content-type
id="com.xyz.ide.core.contentType.dummy"
base-type="org.eclipse.core.runtime.xml"
file-extensions="blabla"
/>

</extension>

<extension
point="org.eclipse.wst.sse.ui.sourcevalidation">
<validator
scope="total"
class="mc.CustomValidator"
id="com.xyz.myValidator">
<contentTypeIdentifier
id="com.xyz.ide.core.contentType.dummy">
<partitionType
id="org.eclipse.wst.xml.XML_DEFAULT">
</partitionType>
</contentTypeIdentifier>
</validator>
</extension>

</plugin>

CustomValidator.java

public class CustomValidator implements ISourceValidator, IValidator {
XMLValidator validator = new XMLValidator();
IDocument document;

public void validate(IValidationContext helper, IReporter reporter) {
String fileContent = this.document.get();
final InputStream is = new ByteArrayInputStream(fileContent.toLowerCase().getBytes());

// Whats the problem in this line???
XMLValidationReport report = validator.validate("/home/rchawla/xmlWorkspace/abc.xsd", is);

ValidationMessage[] messages = report.getValidationMessages();
for(ValidationMessage message:messages){
System.out.println(message.getMessage());
}
}

我可以在调试模式下运行插件时点击 validate 方法,但文档没有得到 xsd 的验证。上述方法有什么问题,ValidationMessage[] messages = report.getValidationMessages(); 给出零消息,即使主文档文件中存在错误。

4

1 回答 1

0

我在尝试使org.eclipse.wst.sse.ui.sourcevalidation扩展点工作时也遇到了很多麻烦。我最终使用了另一个扩展点org.eclipse.wst.validation.validatorV2。两个验证器之间的唯一区别是,这个验证器仅在您保存文件时触发,而不是在您键入时触发。请参阅下面的示例:

<extension id="customValidator" name="Custom Validator" point="org.eclipse.wst.validation.validatorV2">
    <validator class="aaa.bbb.CustomValidator" markerId="customMarker" version="3">
        <include>
            <rules>
                <contentType id="customContentType" exactMatch="false"/>
            </rules>
        </include>
    </validator>
</extension>

您的验证器实现应该覆盖org.eclipse.wst.validation.AbstractValidator.

于 2012-12-03T10:13:31.660 回答