如何避免删除XSD文件的根元素

时间:2017-12-12 16:28:34

标签: xml xsd xsd-validation xml-validation

我试图将xsd文件的root或parent元素的remove选项变灰。它在其派生节点中工作,但不在根节点中工作。

这是有效的:

<xs:attribute name="user-login" type="xs:string" use="required"/>

这在父元素中无效:

<xs:element name="MyProgram-Deploy" use="required">

XML GUI showing black, not grey, Remove command

2 个答案:

答案 0 :(得分:1)

在XSD中,use="required"不适合xs:element。而是使用minOccurs="1"来表示该元素是必需的。但请注意,根元素是全局声明的,minOccursmaxOccurs不适用于全局声明的元素。 XML文档中必须有 一个根元素 ;它是非选择性的,不能重复。

答案 1 :(得分:-1)

最后,我所做的是创建一个继承自XMLNodeActionManager的Java类,该类从IMenuListener类的继承类调用。 每次显示上下文时都会调用此IMenuListener,因此必须覆盖XMLTableTreeViewer的继承类的createContextMenu()方法才能使用上一个侦听器。 在XMLNodeActionManager类中,我查看了上下文菜单的所有选项,并删除了我不想要的那个:

XMLTableTreeViewer.createContextMenu - &gt; IMenuListener - &gt; XmlNodeActionManager.contributeActions

<强> MyTestIMenuListener:

    class MyTestNodeActionMenuListener implements IMenuListener {
    @Override
    public void menuAboutToShow(org.eclipse.jface.action.IMenuManager manager) {
        SilecsXmlNodeActionManager nodeActionManager = new MyTestXmlNodeActionManager(
                ((IDOMDocument) getInput()).getModel(), MyTestXMLTableTreeViewer.this);
        nodeActionManager.fillContextMenu(manager, getSelection());          
    }
}

MyTestXMLTableTreeViewer扩展XMLTableTreeViewer:

@Override
protected void createContextMenu() {
    MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
    contextMenu.add(new Separator("additions")); //$NON-NLS-1$
    contextMenu.setRemoveAllWhenShown(true);
    contextMenu.addMenuListener(new MyTestNodeActionMenuListener());
    Menu menu = contextMenu.createContextMenu(getControl());
    getControl().setMenu(menu);
}

MyTestXmlNodeActionManager扩展XmlNodeActionManager:

@Override
public void contributeActions(IMenuManager menu, List selection) {
    super.contributeActions(menu, selection);

    Node node = (Node) selection.iterator().next();

    IContributionItem removeMenuItem = null;
    try {
        IContributionItem[] menuItems = menu.getItems();
        for (IContributionItem menuItem: menuItems) {
            if (menuItem instanceof ActionContributionItem) {
                if (((ActionContributionItem) menuItem).getAction() instanceof AbstractNodeActionManager.DeleteAction) {
                    removeMenuItem = menu.remove(menuItem);
                    break;
                }
            }
        }
    } catch (Exception e) {

    }

}