簡體   English   中英

基於XSD值的Java SAX策略模式

[英]Java SAX strategy pattern based on XSD value

如何基於XSD定義在SAX上實施策略模式?

like:
if xsd = V1 use V1Parser
if xsd = V2 use V2Parser
if xsd = V3 use V3Parser
else error

問題是我必須窺視XML才能知道定義了哪個XSD,但是之后我將無法再更改解析器(並且我不會再開始,因為xsd的定義不是在開始時就定義的,也不是格式正確的XML。 ERM系統)。

您知道解決方法嗎?

解決方案可能是使用DefaultHandler VDispatch,它在內部將SAX事件委托給適當的DefaultHandler V1,V2或V3。

startElement VDispatch查找相關子樹的開頭。 根據子樹XSD,它選擇相應的處理程序V1,V2或V3。

在子樹內部,它將所有事件轉發到該選定的處理程序。

在子樹之外,它會忽略所有事件。

public class VDispatch extends DefaultHandler {
     private DefaultHandler current_;
     private int subtreeLevel_;

     public void startElement(String uri, String localName, String qName, Attributes attributes) {
          if ((current_ == null) && (subtree-is-starting)) {
              current_ = select-handler-based-on-xsd;
              subtreeLevel_ = 0;
          }
          if (current_ != null) {
              current_.startElement(uri, localName, qName, attributes);
              subtreeLevel_++;
          }
     }

     public void endElement(String uri, String localName, String qName) {
          if (current_ != null) {
              current_.endElement(uri, localName, qName);
              if (--subtreeLevel_ == 0)
                  current_ = null;
          }
     }

     // simple forwarding in all other DefaultHandler methods
     public void characters(char[] ch, int start, int length) {
          if (current_ != null)
              current_.characters(ch, start, length);
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM