     private let soapNameSpace: String
     private let targetNamespace: String
 
-    public init?(xml: XMLDocument, targetNamespace: String) {
+    public init?(xml: Fuzi.XMLDocument, targetNamespace: String) {
 //        guard xml.root!.namespaceHref == "http://schemas.xmlsoap.org/soap/envelope/",
 //            let soapNameSpace = xml.root!.namespace else {
 //            return nil

public enum SOAPParamError: Error { case unknown }

// ex. let x: Bool = parseXSDType(v), success only if T(v) is succeeded
public func parseXSDType<T: ExpressibleByXML>(_ elements: [XMLElement]) throws -> T {
    guard let e = elements.first, let v = try T(xml: e) else { throw SOAPParamError.unknown }
    return v
}

// ex. let x: Bool? = parseXSDType(v), failure only if T(v) is failed
public func parseXSDType<T: ExpressibleByXML>(_ elements: [XMLElement]) throws -> T? {
    guard let e = elements.first else { return nil }
    return try T(xml: e)
}

// ex. let x: [String] = parseXSDType(v), failure only if any T(v.children) is failed
public func parseXSDType<T: ExpressibleByXML>(_ elements: [XMLElement]) throws -> [T] {
    return try elements.map { e -> T in try parseXSDType([e])}
}

    //  * Self: parse succeeded to an value
    //  * nil: parse succeeded to nil
    //  * SOAPParamError.unknown: parse failed
    init?(xml: Fuzi.XMLElement) throws // SOAPParamError
    init?(xmlValue: String) throws // SOAPParamError
}

public extension ExpressibleByXML {
    // default implementation for primitive values
    // element nil check and text value empty check
    init?(xml: Fuzi.XMLElement) throws {
      let value = xml.stringValue
        guard !value.isEmpty else { return nil }
        try self.init(xmlValue: value)
