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

Xml 如何避免删除XSD文件的根元素,xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,我正在尝试灰显xsd文件的根元素或父元素的remove选项。它在其派生节点中工作,但在根节点中不工作 这是有效的: <xs:attribute name="user-login" type="xs:string" use="required"/> 这在父元素中不起作用: <xs:element name="MyProgram-Deploy" use="required"> 在XSD中,use=“required”不适用于xs:element。相反,使用minO

我正在尝试灰显xsd文件的根元素或父元素的remove选项。它在其派生节点中工作,但在根节点中不工作

这是有效的:

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

这在父元素中不起作用:

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


在XSD中,
use=“required”
不适用于
xs:element
。相反,使用
minOccurs=“1”
表示需要该元素。但是,请注意,根元素是全局声明的,
minOccurs
maxOccurs
不适用于全局声明的元素。XML文档中必须只有一个根元素;它是非可选的,不能重复。

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

XMLTableTreeViewer.createContextMenu->IMenuListener->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());          
    }
}
@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);
}
@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) {

    }

}
MyTestXMLTableTreeViewer扩展XMLTableTreeViewer:

    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());          
    }
}
@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);
}
@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) {

    }

}
MyTestXmlNodeActionManager扩展XmlNodeActionManager:

    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());          
    }
}
@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);
}
@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) {

    }

}

我试图灰显是什么意思?我添加了一个图像。这意味着禁用此选项您是否向特定的XML编辑器询问特定的问题?我知道了。非常感谢。由于“minOccurs”在全局根元素中不起作用,是否还有其他方法将此选项灰显?请认识到,将您的问题用“灰显”菜单命令的方式表达,会根据您尚未命名的特定XML编辑器来解决问题。一般来说,通过询问XML和XSD,您会得到最好的帮助。为了生成XSD所需的特定根元素,您所能做的最好的事情就是确保它是XSD中唯一的全局元素。对于任何给定的XML编辑器,这是否足以禁用remove命令是该编辑器的一个实现细节。