[oXygen-user] DocumentTypeCustomRuleMatcher that depends on document child element

Benoit CHERY benoit.chery at 4dconcept.fr
Wed Apr 11 04:49:18 CDT 2012


Thanks, it first did not work but i've seen in debug mode that i had to 
use qName instead of localName.

Regards, Benoît.

Le 11/04/2012 09:20, Oxygen XML Editor Support a écrit :
> Hi Benoît,
>
> Basically Oxygen tries to detect the document type without parsing the
> entire file, just by looking at the root element (or before the root
> element, at the document type).
>
> But one of the parameters in the interface is "systemID". This is the
> URL which corresponds to the XML file which is about to be opened.
> So what you could try to do would be to create a SAX Parser over that
> systemID and check for that particular XML element, something like:
>
>> /**
>>   * Match XML files which have the<proced>  element inside a<content>  element
>>   */
>> public class ProcedCustomRuleMatcher implements DocumentTypeCustomRuleMatcher {
>>
>>    private boolean matches = false;
>>    private Stack<String>  elements = new Stack<String>();
>>    /**
>>     * Try to find a<code>DITAArchVersion</code>  attribute in the root attributes.
>>     *
>>     * @see ro.sync.ecss.extensions.api.DocumentTypeCustomRuleMatcher#matches(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
>>     */
>>    public boolean matches(String systemID, String rootNamespace, String rootLocalName,
>>        String doctypePublicID, Attributes rootAttributes) {
>>      matches = false;
>>      try {
>>        SAXParserFactory.newInstance().newSAXParser().parse(new InputSource(systemID), new DefaultHandler() {
>>          /**
>>           * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
>>           */
>>          @Override
>>          public void startElement(String uri, String localName, String qName, Attributes attributes)
>>              throws SAXException {
>>            if("proced".equals(localName)) {
>>              if("content".equals(elements.peek())) {
>>                matches = true;
>>                //Break the entire parsing early
>>                throw new SAXParseException("BROKEN", null);
>>              }
>>            }
>>            elements.push(localName);
>>          }
>>          /**
>>           * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
>>           */
>>          @Override
>>          public void endElement(String uri, String localName, String qName) throws SAXException {
>>            elements.pop();
>>          }
>>        });
>>      } catch (SAXException e) {
>>        e.printStackTrace();
>>      } catch (IOException e) {
>>        e.printStackTrace();
>>      } catch (ParserConfigurationException e) {
>>        e.printStackTrace();
>>      }
>>      return matches;
>>    }
>>    /**
>>     * @see ro.sync.ecss.extensions.api.Extension#getDescription()
>>     */
>>    @Override
>>    public String getDescription() {
>>      return "Match XML files which have the<proced>  element inside a<content>  element";
>>    }
>> }
> You should also probably have a fallback document type which is matched
> by the XML file even if it does not contain one of those searched XML
> elements.
>
> Regards,
> Radu
>
> Radu Coravu
> <oXygen/>   XML Editor, Schema Editor and XSLT Editor/Debugger
> http://www.oxygenxml.com
>
> On 4/10/2012 6:13 PM, Benoit CHERY wrote:
>> Hi,
>>
>> I'd like to switch document type depending on an xpath. I thought
>> DocumentTypeCustomRuleMatcher would do it, but it seems it doesn't
>> because it only has 5 parameters (which i don't care about) in matches
>> method.
>>
>> My documents look like this :
>> <doc>
>> <status/>
>> <content>
>> <!-- element here could be either 'proced' or 'desc' -->
>> </content>
>> </doc>
>>
>> I want to apply different css, schema, toolbar depending on the 'proced'
>> or 'desc' element, is it possible?
>> I can't change my document structure because it's normalized.
>>
>> Thanks for all.
>> Benoît.
>> _______________________________________________
>> oXygen-user mailing list
>> oXygen-user at oxygenxml.com
>> http://www.oxygenxml.com/mailman/listinfo/oxygen-user
>>
> _______________________________________________
> oXygen-user mailing list
> oXygen-user at oxygenxml.com
> http://www.oxygenxml.com/mailman/listinfo/oxygen-user


More information about the oXygen-user mailing list