You can combine ComplexFilterParts or you can using the AdditionalOperand property on the ComplexFilterPart object. There's an example at the bottom of this this page.
<Filter xsi:type="ComplexFilterPart">
<LeftOperand xsi:type="SimpleFilterPart">
<Property>SendID</Property>
<SimpleOperator>equals</SimpleOperator>
<Value>10980375</Value>
</LeftOperand>
<LogicalOperator>AND</LogicalOperator>
<RightOperand xsi:type="SimpleFilterPart">
<Property>BatchID</Property>
<SimpleOperator>equals</SimpleOperator>
<Value>5</Value>
</RightOperand>
<AdditionalOperands>
<Operand xsi:type="SimpleFilterPart">
<Property>SubscriberID</Property>
<SimpleOperator>equals</SimpleOperator>
<Value>199672583</Value>
</Operand>
</AdditionalOperands>
</Filter>
UPDATE: Here's a nested ComplexFilterPart example (from a DataExtensionObject retrieve):
<Filter xsi:type="ComplexFilterPart">
<LeftOperand xsi:type="ComplexFilterPart">
<LeftOperand xsi:type="SimpleFilterPart">
<Property>EmailAddress</Property>
<SimpleOperator>equals</SimpleOperator>
<Value>[email protected]</Value>
</LeftOperand>
<LogicalOperator>AND</LogicalOperator>
<RightOperand xsi:type="SimpleFilterPart">
<Property>InsertDate</Property>
<SimpleOperator>lessThan</SimpleOperator>
<DateValue>2015-01-23T10:12:21</DateValue>
</RightOperand>
</LeftOperand>
<LogicalOperator>AND</LogicalOperator>
<RightOperand xsi:type="SimpleFilterPart">
<Property>_CustomObjectKey</Property>
<SimpleOperator>equals</SimpleOperator>
<Value>260239</Value>
</RightOperand>
<AdditionalOperands />
</Filter>
UPDATE: Here's a WSProxy snippet that illustrates how you might construct a multiple AND conditional. This one is for a customer service lookup page that I built in CloudPages:
var prox = new Script.Util.WSProxy();
var objectType = "DataExtensionObject[" + deExternalKey + "]";
var cols = ["EmailAddress", "FirstName", "LastName", "AccountNumber", "PLU", "CompanyCode", "subjectLine", "dateSent", "emailStatus", "recordID", "arrivalStatus", "failureReason", "totalOpens", "uniqueOpens", "openTime"];
var sfp_em = {Property: "EmailAddress", SimpleOperator: "like", Value: email};
var sfp_fn = {Property: "FirstName", SimpleOperator: "like", Value: firstName};
var sfp_ln = {Property: "LastName", SimpleOperator: "like", Value: lastName};
var sfp_an = {Property: "AccountNumber", SimpleOperator: "equals", Value: accountNumber};
var sfp_pl = {Property: "PLU", SimpleOperator: "equals", Value: plu};
var sfp_cc = {Property: "CompanyCode", SimpleOperator: "equals", Value: cmpCd};
var sfp_df = {Property: "dateSent", SimpleOperator: "greaterThan",Value: dateFrom};
var sfp_dt = {Property: "dateSent", SimpleOperator: "lessThan", Value: dateTo};
var filter = [];
// dates are always present
filter = {LeftOperand: sfp_df, LogicalOperator: "AND", RightOperand: sfp_dt};
if (email) {
filter = {LeftOperand: filter, LogicalOperator: "AND", RightOperand: sfp_em};
}
if (firstName) {
filter = {LeftOperand: filter, LogicalOperator: "AND", RightOperand: sfp_fn};
}
if (lastName) {
filter = {LeftOperand: filter, LogicalOperator: "AND", RightOperand: sfp_ln};
}
if (accountNumber) {
filter = {LeftOperand: filter, LogicalOperator: "AND", RightOperand: sfp_an};
}
if (plu) {
filter = {LeftOperand: filter, LogicalOperator: "AND", RightOperand: sfp_pl};
}
if (cmpCd) {
filter = {LeftOperand: filter, LogicalOperator: "AND", RightOperand: sfp_cc};
}
// if no fields are filled in, return no rows
if (email == "" && firstName == "" && lastName == "" && accountNumber == "" && plu == "" && cmpCd == "") {
filter = {Property: "EmailAddress", SimpleOperator: "equals", Value: "null"};
}
var opts = { BatchSize: 500 };
var reqID = null;
var data = reqID == null ? prox.retrieve(objectType, cols, filter, opts, props) : prox.getNextBatch(objectType, reqID);