     }
 
     public struct Body {
-        public var output: XMLElement? // first <(ns2):(name) xmlns:(ns2)="(targetNamespace)">...</...>
+        public var output: Fuzi.XMLElement? // first <(ns2):(name) xmlns:(ns2)="(targetNamespace)">...</...>
         public var fault: Fault?
 
-        public var xml: XMLElement // for now, raw XML
-
-        public init(xml: XMLElement, soapNameSpace: String, targetNamespace: String) {
+        public var xml: Fuzi.XMLElement // for now, raw XML
+
+        public init(xml: Fuzi.XMLElement, soapNameSpace: String, targetNamespace: String) {
             self.xml = xml
             self.fault = xml.firstChild(tag: "Fault").flatMap {Fault(xml: $0)}
             self.output = self.fault == nil ? xml.children.first : nil

    private let soapNameSpace: String
    private let targetNamespace: String

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

    //  * 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)
