Как я могу заставить Ось 1.4 не генерировать несколько префиксов для того же пространства имен XML?

Справка Microsoft утверждает, что метод shape.delete предназначен для удаления фигуры. Если вы хотите использовать форму позже, то .visible = true / false может помочь?

6
задан Christian Berg 15 September 2008 в 12:48
поделиться

2 ответа

У меня есть та же проблема. В настоящий момент я работал вокруг этого путем записи расширения BasicHandler, и затем обхода SOAPPart сам и перемещения ссылки пространства имен до родительского узла. Мне не нравится это решение, но это, действительно кажется, работает.

Я действительно надеюсь, что кто-то приезжает и говорит нам, что мы должны сделать.

Править

Это слишком сложно, и как я сказал, мне не нравится он вообще, но здесь мы идем. Я на самом деле повредил функциональность в несколько классов (Это не было единственным управлением, которое мы должны были сделать в том проекте, таким образом, были другие реализации), я действительно надеюсь, что кто-то может скоро зафиксировать это. Это использует dom4j для обработки прохождения XML через процесс SOAP, таким образом, Вам будет нужен dom4j, чтобы заставить его работать.

public class XMLManipulationHandler extends BasicHandler {
    private static Log log = LogFactory.getLog(XMLManipulationHandler.class);
    private static List processingHandlers;

    public static void setProcessingHandlers(List handlers) {
        processingHandlers = handlers;
    }

    protected Document process(Document doc) {
        if (processingHandlers == null) {
            processingHandlers = new ArrayList();
            processingHandlers.add(new EmptyProcessingHandler());
        }
        log.trace(processingHandlers);
        treeWalk(doc.getRootElement());
        return doc;
    }

    protected void treeWalk(Element element) {
        for (int i = 0, size = element.nodeCount(); i < size; i++) {
            Node node = element.node(i);
            for (int handlerIndex = 0; handlerIndex < processingHandlers.size(); handlerIndex++) {
                ProcessingHandler handler = (ProcessingHandler) processingHandlers.get(handlerIndex);
                handler.process(node);
            }
            if (node instanceof Element) {
                treeWalk((Element) node);
            }
        }
    }

    public void invoke(MessageContext context) throws AxisFault {
        if (!context.getPastPivot()) {
            SOAPMessage message = context.getMessage();
            SOAPPart soapPart = message.getSOAPPart();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            try {
                message.writeTo(baos);
                baos.flush();
                baos.close();

                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                SAXReader saxReader = new SAXReader();
                Document doc = saxReader.read(bais);
                doc = process(doc);
                DocumentSource ds = new DocumentSource(doc);
                soapPart.setContent(ds);
                message.saveChanges();
            } catch (Exception e) {
                throw new AxisFault("Error Caught processing document in XMLManipulationHandler", e);
            }
        }
    }
}
public interface ProcessingHandler {
    public Node process(Node node);
}
public class NamespaceRemovalHandler implements ProcessingHandler {
    private static Log log = LogFactory.getLog(NamespaceRemovalHandler.class);
    private Namespace namespace;
    private String targetElement;
    private Set ignoreElements;

    public NamespaceRemovalHandler() {
        ignoreElements = new HashSet();
    }

    public Node process(Node node) {
        if (node instanceof Element) {
            Element element = (Element) node;
            if (element.isRootElement()) {
                // Evidently, we never actually see the root node when we're called from
                // SOAP...
            } else {
                if (element.getName().equals(targetElement)) {
                    log.trace("Found the target Element.  Adding requested namespace");
                    Namespace already = element.getNamespaceForURI(namespace.getURI());
                    if (already == null) {
                        element.add(namespace);
                    }
                } else if (!ignoreElements.contains(element.getName())) {
                    Namespace target = element.getNamespaceForURI(namespace.getURI());
                    if (target != null) {
                        element.remove(target);
                        element.setQName(new QName(element.getName(), namespace));
                    }
                }

                Attribute type = element.attribute("type");
                if (type != null) {
                    log.trace("Replacing type information: " + type.getText());
                    String typeText = type.getText();
                    typeText = typeText.replaceAll("ns[0-9]+", namespace.getPrefix());
                    type.setText(typeText);
                }
            }
        }

        return node;
    }

    public Namespace getNamespace() {
        return namespace;
    }

    public void setNamespace(Namespace namespace) {
        this.namespace = namespace;
    }

    /**
     * @return the targetElement
     */
    public String getTargetElement() {
        return targetElement;
    }

    /**
     * @param targetElement the targetElement to set
     */
    public void setTargetElement(String targetElement) {
        this.targetElement = targetElement;
    }

    /**
     * @return the ignoreElements
     */
    public Set getIgnoreElements() {
        return ignoreElements;
    }

    /**
     * @param ignoreElements the ignoreElements to set
     */
    public void setIgnoreElements(Set ignoreElements) {
        this.ignoreElements = ignoreElements;
    }

    public void addIgnoreElement(String element) {
        this.ignoreElements.add(element);
    }
}

Никакая гарантия, и т.д., и т.д.

3
ответ дан 17 December 2019 в 02:35
поделиться

Измените wsdd своего клиента для установки enableNamespacePrefixOptimization кому: true

<globalConfiguration >
  <parameter name="enableNamespacePrefixOptimization" value="true"/>
1
ответ дан 17 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: